1

私は Symfony と Doctrine が初めてで、2 つのテーブルを結合しようとしているので、Twig テンプレートから関連する値に簡単にアクセスできます。

ここに私のデータベーススキームがあります:

+--------------------------------------+--------------------+
|Messages                              |   User             |
|id    user        text        user_id |   id    name       |
|1     testuser    something   1       |   1     John       |
+--------------------------------------+--------------------+

これは私のMessageエンティティです:

/**
 * @ORM\Entity
 * @ORM\Table(name="Messages")
 */
class Message {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    protected $user_id;

    /**
     * @ORM\Column(name="text", type="text")
     */
    protected $text;

    /**
     * @ORM\ManyToOne(targetEntity="User")
     * */
    private $user;    
}

そして、これは私のUserエンティティです:

/**
 * @ORM\Entity
 * @ORM\Table(name="Users")
 */
class User {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;
}

次に、コントローラーで$messages変数を Twig テンプレートに送信します。

$messages = $this->getDoctrine()->getEntityManager()->getRepository('MeMyBundle:Message')->findAll()

問題は、接合が適切に行われているかどうかです。Twig でnameプロパティにアクセスするにはどうすればよいですか? messageありがとう。

4

1 に答える 1

2

多対 1 の関係のため、Message クラスの変数 $user は User 型のオブジェクトである必要があります。変数 $user と $name は非公開または保護されているため、それらの getter と setter を作成するか、Doctrine にそれらを生成させる必要があります。その後、動作する$messages[i]->getUser()-getName()はずです。(ゲッターとセッターの生成)

リレーションシップで属性にアクセスする方法の詳細については、ドキュメントの関連オブジェクトの取得セクションを詳しく見てください。

同じsymfonyのドキュメントページから「もちろん、両方のオブジェクトにアクセスする必要があることを前もって知っている場合は、元のクエリで結合を発行することで2番目のクエリを回避できます。」遅延ロードされたクエリの代わりに真の JOIN が必要な場合は、ドキュメントに従って独自の SQL クエリを作成できます

于 2013-10-24T00:11:43.400 に答える