我使用many-to-one
对这三个实体进行了映射和相关,我需要在模板中从关联中获取驱动程序名称,以便我在模板上执行此操作:
{% for devices in pagination %}
{{ devices.getDriver.name }}
{% endfor %}
但是我收到了这个错误:
方法" getDriver" for object" Device \ DeviceBundle \ Entity \ Device"不 不存在于 /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig 在第47行
这是实体和地图信息:
Device.php
class Device
{
protected $id;
protected $description;
protected $imei;
protected $created;
protected $modified;
protected $deletedAt;
public function getId()
{
return $this->id;
}
public function getDescription()
{
return $this->description;
}
public function setDescription($description)
{
$this->description = $description;
}
public function getImei()
{
return $this->imei;
}
public function setImei($imei)
{
$this->imei = $imei;
}
}
设备映射
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Device\DeviceBundle\Entity\Device" table="device" repository-class="Device\DeviceBundle\Entity\Repository\DeviceRepository">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<field name="description" column="description" type="string" length="255" unique="true" nullable="false" />
<field name="imei" column="imei" type="string" length="17" unique="true" nullable="false" />
<field name="created" type="datetime">
<gedmo:timestampable on="create"/>
</field>
<field name="modified" type="datetime">
<gedmo:timestampable on="update"/>
</field>
<field name="deletedAt" type="datetime" nullable="true" />
<gedmo:soft-deleteable field-name="deletedAt" time-aware="false" />
</entity>
</doctrine-mapping>
DriverHasDevice.php(关系实体)
class DriverHasDevice
{
protected $driver;
protected $device;
public function setDriver($driver)
{
$this->driver = $driver;
}
public function getDriver()
{
return $this->driver;
}
public function setDevice($device)
{
$this->device = $device;
}
public function getDevice()
{
return $this->device;
}
}
DriverHasDevice的映射
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Device\DeviceBundle\Entity\DriverHasDevice" table="driver_has_device">
<id name="driver" column="driver" association-key="true" />
<id name="device" column="device" association-key="true" />
<many-to-one field="driver" target-entity="Driver\DriverBundle\Entity\Driver">
<join-column name="driver" referenced-column-name="id"/>
</many-to-one>
<many-to-one field="device" target-entity="Device\DeviceBundle\Entity\Device">
<join-column name="device" referenced-column-name="id"/>
</many-to-one>
</entity>
</doctrine-mapping>
第三个实体不相关,所以我不显示代码,现在,我如何获得驱动程序名称?
添加方法
我将此方法添加到Device.php
:
public function getDriver()
{
return $this->driver;
}
但现在错误是这个:
无法访问NULL变量(&#34;&#34;)中的属性(&#34; name&#34;) /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig 在第49行
为什么?
答案 0 :(得分:1)
您的DeviceClass没有getDriver方法,就像在异常中编写的一样。 您必须实现驱动程序属性和getter / setter。
此外,您不需要实现DriverHasDevice类。 只需将DeviceClass的驱动程序属性映射到DriverClass的devices属性
即可它完全写在doku中,只需向下滚动或搜索&#34; ManyToOne&#34;。 http://symfony.com/doc/current/book/doctrine.htm
无论如何,如果您执行以下步骤,它将起作用:
它看起来像这样:
<many-to-one field="driver"
target-entity="Driver"
inversed-by="devices"
>
如果你想让你的驱动程序知道它的设备,你必须添加一个ArrayCollection作为属性并将其映射回设备。
答案 1 :(得分:0)
首先,您应该修改您的实体,包括driver
受保护字段。
class Device
{
[...]
protected $driver
[...]
}
其次,您应该为该类属性
实现getter
和setter
class Device
{
[...]
public function setDriver($driver) {
$this->driver = $driver;
return $this;
}
public function getDriver($driver) {
return $this->driver
}
[...]
}
第三,在twig中,你不应该试着直接调用方法:框架会为你做。
{% for devices in pagination %}
{{ devices.driver.name }}
{% endfor %}
我没有验证您的映射文件,所以您可能需要正确修改它们......