Имам 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:
$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());