ユーザー、エリア、連絡先の 3 つのテーブルがあります。連絡先は、ユーザーまたはエリアに属することができます。ユーザーは多くのエリアに所属できます。
ユーザーに属するすべての連絡先 (DB で具体的に定義されている) と、ユーザーと同じエリアに属するすべての連絡先を取得したいと考えています。
データベース マッピングと、必要なものを取得するために DQL で記述する必要があるクエリについて、新たな視点を得ることができますか。データベースのマッピングに何か問題がありますか?
私は間違いなく SQL 派で、単純な SQL で必要なものを簡単に取得できます。プレーン SQL では、ここで私がやりたいことは次のとおりです。
select c.* from contact c LEFT JOIN user_area ua ON c.area_id=ua.area_id where (ua.user_id=XXX OR c.user_id=XXX);
ユーザー
/**
* @ORM\ManyToMany(targetEntity="area", inversedBy="areas")
* @ORM\JoinTable(name="user_area",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="area_id", referencedColumnName="id")}
* )
*/
private $areas;
/**
* @ORM\OneToMany(targetEntity="Contact", mappedBy="user")
*/
private $contacts;
コンタクト
/**
* @ORM\ManyToOne(targetEntity="Area")
* @ORM\JoinColumn(name="area_id", referencedColumnName="id")
*/
private $area;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="Contacts")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
範囲
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="users")
*/
private $users;
/**
* @ORM\OneToMany(targetEntity="Contact", mappedBy="area")
*/
private $contacts;
私が直面している主な問題は、DQL が実際にオブジェクトをクエリすることを望んでいるということです。SQL では、ユーザー/エリアの関係テーブルをクエリして、必要なものを取得する方が簡単です。連絡先からエリア、連絡先からユーザー、エリアからユーザーを取得するクエリを作成しようとしましたが、「ユーザー」はエリア オブジェクトで定義されたインデックスではないというエラー メッセージが表示されます。繰り返しますが、私は Doctrine の初心者なので、何か間違ったことをしている可能性があります。
これは、Symfony の User オブジェクトからクエリを試みた結果です。
$qb = $em->createQueryBuilder()
->addSelect('c')
->from('MyBundle:Contact', 'c')
->leftJoin('c.area', 'ca')
->leftJoin('c.user', 'cu')
->leftJoin('ca.users', 'cau')
->add('where', 'c.user = ?1 OR cau.id = ?1')
->add('orderBy', 'c.name')
->setParameter(1, $this->getId());