У меня есть объект « User
и « Company
. Каждый User
принадлежит Company
. Вот мои сущности (сокращенные):
<?php namespace App\Model\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Table(name="user") */ class User { /** * @ORM\Id * @ORM\Column(type="integer", name="user_id") * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(length=200) */ private $email; /** * @ORM\ManyToOne(targetEntity="Company", inversedBy="users", fetch="EAGER") * @ORM\JoinColumn(name="company_id", referencedColumnName="company_id", nullable=false) */ private $company; // And a bunch of getters/setters <?php namespace App\Model\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Table(name="company") */ class Company { /** * @var int * * @ORM\Id * @ORM\Column(type="integer", name="company_id", options={"unsigned":1}) * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(length=100, unique=true) */ private $name = ""; /** * @var Doctrine\Common\Collections\ArrayCollection * * @ORM\OneToMany(targetEntity="User", mappedBy="company", cascade={"persist", "remove"}, fetch="LAZY") */ private $users; // getters/setters
Когда я тестировал свой производственный код, я забыл добавить компанию в таблицу компаний. Итак, когда я сделал базовый $entityManager->getRepository('App/Model/Entity/User')->findAll();
чтобы моя база данных подключалась правильно, она возвращала пустой массив, хотя у меня был пользователь.
Я выкопал немного, чтобы найти SQL, который он выводил, и это было следующим:
SELECT t0.user_id AS user_id1, t0.email AS email2, t0.company_id AS company_id3, t10.company_id AS company_id5, t10.name AS name6 FROM user t0 INNER JOIN company t10 ON t0.company_id = t10.company_id
Я понял, что INNER JOIN
была причиной того, что у меня не было пользователей. Теперь мне любопытно, что заставляет Doctrine использовать INNER JOIN
? Является ли это результатом nullable=false
для атрибута компании в объекте User или что-то еще?