Доктрина - Как получить записи, когда первичный ключ НЕ равен внешнему ключу - PullRequest
0 голосов
/ 09 ноября 2019

Я изучаю Doctrine, создавая приложение Symfony, и у меня возникла проблема с моим кодом. Я пытаюсь получить все записи из таблицы flashcards, за исключением тех, которые помещены в таблицу trash. Другими словами, мне нужны те карточки, которых нет в таблице trash.

trash и flashcards связаны с отношением один к одному. Первичный ключ flashcards's является внешним ключом trash's, поэтому я попробовал что-то вроде этого:

$qb = $this->createQueryBuilder('f');
$expr = $qb->expr();

$query = $qb
    ->join('f.trash', 't')
    ->andWhere($expr->neq('t.flashcard', 'f.id'))
    ->getQuery()
    ->getResult();

Запрос выполнен правильно, ошибок нет, но и нет возвращаемых записей.

Не могли бы вы написать, почему этот код ORM не возвращает никаких записей, и можете ли вы дать мне несколько советов, как заставить его работать?

Заранее спасибо за каждый ответ!

1 Ответ

1 голос
/ 09 ноября 2019

Вам нужно ВНЕШНЕЕ СОЕДИНЕНИЕ (которое вы не найдете в Учении, но продолжаете читать):

OUTER JOIN

Где Таблица A = карточки, Таблица B = trash;

Пример запроса для получения этого:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

подробнее о возможных объединениях и их запросах

Использование Doctrine делаетне заставляя вас использовать queryBuilder, вы также можете использовать простой SQL с Docktrine.

Все, что вам нужно, - это создать запрос самостоятельно и выполнить его с подключением Doctrine, как в документации . :

use Doctrine\DBAL\DriverManager;

$conn = DriverManager::getConnection($params, $config);

$sql = "SELECT * FROM articles";
$stmt = $conn->query($sql);

В Doctrine нет ни ПРАВИЛЬНЫХ, ни ВНЕШНИХ СОЕДИНЕНИЙ, я полагаю, что это обусловлено простотой и важностью переносимости проекта.

Возможно, этот вопрос также как-то вам поможет, если вы хотите дать разработчику запросов последнюю попытку.

...