原则查询-获取子对象

时间:2018-11-15 16:57:13

标签: php laravel doctrine

我在Laravel项目中使用Doctrine ORM。我有三张桌子:

  • Smi
  • 设备组
  • 设备

每个设备都有一个设备组,每个设备组都有一个smi。 我要使用Doctrine做的是查询所有群组并获取他们的设备和他们的smi。

这是我在PHP中的查询(来自存储库):

   $results = $this->_em->createQueryBuilder()
            ->select('dg')
            ->from($this->_entityName, 'dg')
            ->innerJoin('dg.smi_enterprise_code', 'sec')
            ->getQuery()
            ->getResult();

这是表格结构:

表device_group:

Table devicegroup

每个设备组都有一个smi_enterprise_code(通过smi_enterprise_code_id)

表smi_enterprise_code:

Table smienterprisecode

餐桌设备:

Table device

这些表格是使用工匠通过这些类创建的:

SmiEnterpriseCode.php

    <?php

    namespace App\Entities;

    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;

    /**
 * @ORM\Entity(repositoryClass="App\Repositories\SmiEnterpriseCode")
 * @ORM\Table(name="smi_enterprise_code")
 */
class SmiEnterpriseCode extends SCAPBaseModel
{
    /**
     * @ORM\Column(type="integer", name="code")
     */
    protected $code;

    /**
     * @ORM\Column(type="string", name="name", length=255)
     */
    protected $name;

    /**
     * One SmiEnterpriseCode has Many DeviceGroup
     * @ORM\OneToMany(targetEntity="App\Entities\DeviceGroup", cascade={"persist", "remove"}, mappedBy="smi_enterprise_code")
     */
    protected $groups;

    public function __construct()
    {
        $this->groups = new ArrayCollection;
    }

    public function getIana()
    {
        return $this->code;
    }

    public function getVendor()
    {
        return $this->name;
    }

    public function getGroups()
    {
        return $this->groups;
    }

    public function addGroup(DeviceGroup $group)
    {
        $this->groups->add($group);
        $group->setSmi($this);
    }

DeviceGroup.php

    <?php

    namespace App\Entities;

    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;

    /**
 * @ORM\Entity(repositoryClass="App\Repositories\DeviceGroup")
 * @ORM\Table(name="device_group")
 */
class DeviceGroup extends SCAPBaseModel
{
    /**
     * @ORM\Column(type="string", name="name", length=255)
     */
    protected $name;

    /**
     * @ORM\Column(type="string", name="oid", length=127)
     */
    protected $oid;

    /**
     * @ORM\Column(type="string", name="hash", length=127)
     */
    protected $hash;

    /**
     * Many DeviceGroup have one SmiEnterpriseCode
     * @ORM\ManyToOne(targetEntity="App\Entities\SmiEnterpriseCode", inversedBy="groups")
     * @ORM\JoinColumn(name="smi_enterprise_code_id", nullable=false)
     */
    protected $smi_enterprise_code;

    /**
     * One DeviceGroup has Many Device
     * @ORM\OneToMany(targetEntity="App\Entities\Device", cascade={"persist", "remove"}, mappedBy="device_group")
     */
    protected $devices;

    public function __construct()
    {
        $this->devices = new ArrayCollection;
    }

    public function setSmi(SmiEnterpriseCode $smi)
    {
        $this->smi_enterprise_code = $smi;
    }

    public function toArray()
    {
        return [
            "id" => $this->id,
            "active" => $this->active,
            "oid" => $this->oid,
            "name" => $this->name,
            "iana" => $this->smi_enterprise_code->getIana(),
            "vendor" => $this->smi_enterprise_code->getVendor(),
            "created_at" => parent::formatTimestamp($this->date_created),
            "updated_at" => parent::formatTimestamp($this->timestamp)
        ];
    }


}

现在,我只想访问组的SMI,稍后再处理设备。

NB:这些类是从超类扩展而来的,该超类包括诸如id,timestamp ...等常见字段。

这就是我现在得到的:

What I get

您可以看到值是null,而我在数据库中创建了条目(无论如何,如果没有SMI,我将无法拥有设备组)。

您知道问题出在哪里吗?

先谢谢您

1 个答案:

答案 0 :(得分:0)

最后,我找出了问题的原因。

为了摆脱它,我只需要运行 php artisan doctrine:generate:entities

此致