Я использую Symfony v3.4 branch с Doctrine.
У меня проблемы с переводом SQL-запроса в запрос Doctrine ORM.
У меня 3 стола.
Пользователь -> 1: 1 -> Фирма -> 1: 1 -> Магазин
(Панель инструментов разработчика Symfony сообщает, что ассоциации в таблицах сделаны правильно).
Я хочу получить данные Shop, соответствующие созданию User, в одном запросе.
Мой SQL, который дает результат:
SELECT *
FROM mp2_fos_user as u
LEFT JOIN mp2_firm AS f ON u.id = f.firmUserId
LEFT JOIN mp2_shop AS s ON f.id = s.shopFirmId
WHERE u.id = 1
Мой запрос ORM Doctrine
$query = $em->createQueryBuilder()
->select('u, f, s')
->from('App:User', 'u')
->leftJoin('u.userFirm WITH u.id = f.firmUserId', 'f')
->leftJoin('f.firmShop WITH f.id = s.shopFirmId', 's')
->where('u.id = :user_id')
->setParameter('user_id', $user_id)
->getQuery();
в настоящий момент запуск кода приводит к ошибке
[Syntax Error] line 0, col 57: Error: Expected end of string, got 'u'
Что было бы лучше всего для моей проблемы?
Помощь будет очень признательна, Спасибо!
пытался:
$query = $em->createQueryBuilder()
->select('s.id')
->from('App:User', 'u')
->leftJoin('u.userFirm WITH f.firmUser = u', 'f')
->leftJoin('f.firmShop WITH s.shopFirm = f', 's')
->where('u.id = :user_id')
->setParameter('user_id', $user_id)
->getQuery();
получил [Syntax Error] line 0, col 54: Error: Expected end of string, got 'f'
@geoB спасибо за предложение. К сожалению, проблема не устранена. Я обновил вопрос, чтобы отразить это. Хотя погрешность немного изменилась ...






Я думал о чем-то более похожем на это (при условии, что имена сущностей верны):
$query = $em->createQueryBuilder()
->select('u, f, s')
->from('App:User', 'u')
->leftJoin('App:UserFirm f WITH f.firmUser = u')
->leftJoin('App:FirmShop s WITH s.shopFirm = f')
->where('u.id = :user_id')
->setParameter('user_id', $user_id)
->getQuery();
Спасибо за идеи, но ваш пример приводит к ошибке.
Нет необходимости использовать предложение WITH, если вы определили сопоставление в своих объектах, предложение WITH используется, когда вы хотите объединить свои объекты с дополнительными критериями соответствия.
class User
{
/**
* @ORM\YourRelationShipNature(targetEntity = "App\Entity\Firm", mappedBy = "user")
*/
private $userFirm;
}
class Firm
{
/**
* @ORM\YourRelationShipNature(targetEntity = "App\Entity\Shop", mappedBy = "firm")
*/
private $firmShop;
}
class Shop
{
//.....
}
И тогда вы можете просто использовать свойства, чтобы присоединиться к своим объектам
$query = $em->createQueryBuilder()
->select('u, f, s')
->from('App:User', 'u')
->leftJoin('u.userFirm', 'f')
->leftJoin('f.firmShop', 's')
->where('u.id = :user_id')
->setParameter('user_id', $user_id)
->getQuery();
Если объект
mp2_firmсвязан с объектомmp2_fos_userчерез свойствоfirmUser, попробуйте оператор WITH какWITH f.firmUser = u. То же самое с идеей сfirmShop