php - Doctrine2 oneToOne 复合主键不可为空

标签 php mysql symfony doctrine-orm doctrine

我在 Doctrine 的 OneToOne 关系上遇到复合主键的问题。当一个对象没有关系(这通常是可能的)时,我收到以下错误消息:

Doctrine\Common\Proxy\Exception\OutOfBoundsException: Missing value for 
primary key idEngine on Farkas\CoreBundle\Entity\Engine

我直接在 Doctrine 中发现了问题:

vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php Line 2116

// TODO: Is this even computed right in all cases of composite keys?
foreach ($assoc['targetToSourceKeyColumns'] as $targetColumn => $srcColumn) {
    $joinColumnValue = isset($data[$srcColumn]) ? $data[$srcColumn] : null;
    if ($joinColumnValue !== null) {
        if ($targetClass->containsForeignIdentifier) {
            $associatedId[$targetClass->getFieldForColumn($targetColumn)] = $joinColumnValue;
        } else {
            $associatedId[$targetClass->fieldNames[$targetColumn]] = $joinColumnValue;
        }
    }
}

$joinColumnValue 当外键为空时为空,因为包含行数据的数组 $data 没有关系字段的数组键。 todo 评论告诉我复合键有问题?

这里是我的两个Entity(只是一个小测试,不要考虑我的entities的逻辑^^):

第一

/**
 * Car
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Farkas\CoreBundle\Entity\CarRepository")
 */
class Car
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_car", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $idCar;


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

    /**
     * @var string
     *
     *
     * @ORM\OneToOne(targetEntity="Engine", mappedBy="car")
     * @ORM\JoinColumns(
     *    @ORM\JoinColumn(name="engine", referencedColumnName="id_engine"),
     *    @ORM\JoinColumn(name="country", referencedColumnName="country")
     * )
     */
    private $engine;

    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(name="country", type="integer")
     */
    private $country;
}

第二

/**
 * Engine
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Farkas\CoreBundle\Entity\EngineRepository")
 */
class Engine
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_engine", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $idEngine;

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

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

    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(name="country", type="integer")
     */
    private $country;

    /**
     * @var integer
     *
     * @ORM\OneToOne(targetEntity="Car", inversedBy="engine")
     * @ORM\JoinColumns(
     *    @ORM\JoinColumn(name="car_id", referencedColumnName="id_car"),
     *    @ORM\JoinColumn(name="country", referencedColumnName="country")
     * )
     */
    private $car;
}

当我尝试执行 findAll() 时,我收到了上面的错误消息。当我直接在 MySQL 中执行生成的 SQL 时,一切看起来都很好:

SELECT t0.id_car AS id_car1, t0.brand AS brand2, t0.country AS country3, 
t0.engine AS engine4, t0.country AS country5 FROM Car t0

这意味着,水合作用不能与空的 oneToOne 关系一起使用。

最佳答案

(代表 OP 发布。)

不出所料,这只是我这边的一个错误。这是解决方案:

汽车实体

/**
 * @var string
 *
 *
 * @ORM\OneToOne(targetEntity="Engine", mappedBy="car")
 * @ORM\JoinColumns(
 *    @ORM\JoinColumn(name="fk_engine", referencedColumnName="id_engine"),
 *    @ORM\JoinColumn(name="fk_engine_country", referencedColumnName="country")
 * )
 */
private $engine;

引擎实体

/**
 * @var integer
 *
 * @ORM\OneToOne(targetEntity="Car", inversedBy="engine")
 * @ORM\JoinColumns(
 *    @ORM\JoinColumn(name="fk_car", referencedColumnName="id_car"),
 *    @ORM\JoinColumn(name="fk_car_country", referencedColumnName="country")
 * )
 */
private $car;

连接列的名称是一个属性,将在数据库中创建为关系字段。我已经在表中有一个名称为 country 的属性。所以最终名称始终是标识关系的外键。

关于php - Doctrine2 oneToOne 复合主键不可为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25587103/

相关文章:

php - 如何在 PHP 中安装补丁

php - 截断包含 HTML 的文本,忽略标签

php - 如何将 MySQLi Query 的结果从一个 PHP 页面传递到另一个页面?

php - 如何使用 7.0.7 在 mysql 数据库中插入特殊字符

doctrine - 在 symfony2 中不同服务之间共享的 Doctrine EntityManager 实例中应该如何处理刷新?

php - 自定义集合操作和IRI转换问题

php - 脚本上传到实时服务器后不起作用

php - Magento - 如何获得除具有特定状态的订单之外的所有订单

python - SQLAlchemy Core 何时进行提交?

php - Symfony 5 Mailer 未定义方法名为 "htmlTemplate"