Я использую Doctrine ORM в своем проекте Laravel. У меня есть три таблицы:
- 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:
Каждая группа устройств имеет один smi_enterprise_code (через smi_enterprise_code_id)
Таблица smi_enterprise_code:
Настольное устройство:
Эти таблицы были созданы с использованием ремесленника с тезисами классов:
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 групп, позже я буду иметь дело с устройствами.
Примечание: классы происходят из суперкласса, который включает в себя общие поля, такие как id, timestamp ...
Вот что я получаю в данный момент:
Как видите, значения равны нулю, тогда как я создал записи в базе данных (и в любом случае у меня не может быть группы устройств без SMI).
Вы видите, в чем проблема?
Заранее благодарю,