Doctrine DQL запрос - получение строк, когда внешний ключ равен нулю - PullRequest
2 голосов
/ 22 февраля 2012

Интересно, может ли кто-нибудь помочь с этим запросом доктрины?
По сути, мой запрос не возвращает строки, в которых не задан внешний ключ или NULL. И я хотел бы вернуть все строки.

Вот 2 схемы

Продукты

class Items{
  /**
   * @var integer $id
   *
   * @Column(name="id", type="integer", nullable=false)
   * @Id
   * @GeneratedValue(strategy="AUTO")
   */
    private $id;
  /**
   * @var string $name
   *
   * @Column(name="name", type="string", length=255, nullable=false)
   */
   private $name;
  /**
   * @var integer $type
   *
   * @ManyToOne(targetEntity="Types")
   *
   */
   private $type;
}

Типы

class Types{
  /**
   * @var integer $id
   *
   * @Column(name="id", type="integer", nullable=false)
   * @Id
   * @GeneratedValue(strategy="AUTO")
   */
    private $id;
  /**
   * @var string $name
   *
   * @Column(name="name", type="string", length=255, nullable=false)
   */
   private $name;
}

И следующий DQL-запрос

SELECT i.id, i.name, t.name as type FROM entity\Items i, entity\Types t WHERE i.type=t.id (OTHER CONDITIONS...)

Этот запрос не возвращает строки, которые не имеют значения во внешнем ключе type.

Можно ли вернуть эти строки?

Заранее спасибо ...

Ответы [ 3 ]

6 голосов
/ 22 февраля 2012

Попробуйте левое соединение:

SELECT i.id, i.name, t.name as type FROM entity\Items i LEFT JOIN i.type t

Это вернет все слева (Предметы) независимо от того, есть ли соответствующий Тип.

2 голосов
/ 17 октября 2014

Очень просто, вы используете ПУСТОЙ

В вашей сущности вы определили обратный ключ, затем вы вызываете принципала своей сущности, где inverseKey - ПУСТОЙ.

ВЫБРАТЬ ИЗ элементов, ГДЕ a.types ПУСТОЙ;

Тогда у меня в поле учебные программы определяется как тип в пунктах

/**
 * inversed key on principal entity (item)
 * @ORM\OneToMany(targetEntity="entity\types", mappedBy="id")
 */
private $types;
0 голосов
/ 22 февраля 2012

Похоже, вы не хотите, чтобы это условие в запросе;

i.type=t.id

Вы пытались удалить его или что-то в этом роде

(i.type=t.id OR i.type IS NULL)
...