【问题标题】:How do I get driver name on this mapping如何在此映射上获取驱动程序名称
【发布时间】:2014-08-23 11:47:13
【问题描述】:

我使用many-to-one 映射并关联了这三个实体,我需要从模板中的关联中获取驱动程序名称,因此我在模板上执行此操作:

{% for devices in pagination %}
   {{ devices.getDriver.name }}
{% endfor %}

但我收到此错误:

对象“Device\DeviceBundle\Entity\Device”的方法“getDriver”确实 不存在于 /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 变量 ("") 中的属性 ("name") /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig 在第 49 行

为什么?

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    你的 DeviceClass 没有 getDriver 方法,就像它写在异常中一样。 你必须实现一个驱动属性和一个getter/setter。

    此外,您不需要实现 DriverHasDevice 类。 只需将您的 DeviceClass 的驱动程序属性映射到 DriverClass 的设备属性

    它完全写在doku中,只需向下滚动或搜索“ManyToOne”。 http://symfony.com/doc/current/book/doctrine.htm

    无论如何,只要你执行以下步骤,它就会起作用:

    • 实现驱动属性
    • 实现 getter/setter
    • 将您的 xml 中的驱动程序设置为与 targetEntity 驱动程序一起归档的 ManyToOne

    看起来像这样:

    <many-to-one field="driver"
            target-entity="Driver"
            inversed-by="devices"
        >
    

    不要伪造,如果您希望您的驱动程序知道其设备,您必须添加一个 ArrayCollection 作为属性并将其映射回设备。

    【讨论】:

    • 你能给我一些关于映射的帮助吗?我试了几次都没有成功:(
    【解决方案2】:

    首先你应该修改你的实体,包括driver受保护的字段。

    class Device
    {
      [...]
      protected $driver
      [...]
    }
    

    其次,您应该为该类属性实现 gettersetter

    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 %}
    

    我没有验证您的映射文件,因此您可能必须正确修改它们...

    【讨论】:

    • 我按照您的建议进行了更改,但同样的错误仍然存​​在 Impossible to access an attribute ("name") on a NULL variable ("") in /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig at line 49 值来自关系 driver_has_device 并且我需要从中获取驱动程序名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2015-08-03
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多