在新实体上关联/解除关联实体

问题描述

有没有办法在 CakePHP4.x 中将一个实体与另一个实体关联/分离? 类似于 Laravel 的? https://laravel.com/docs/8.x/eloquent-relationships#updating-belongs-to-relationships

例如,如果我创建一个新实体并分配一个相关实体,如下所示:

    #in a controller
    $entity = $this->Entity->newEmptyEntity();
    $related = $this->Related->get(1);
    $entity->set('related',$related);

这会将 $related 绑定到 $entity->related 但它不会设置 $entity->relation_id = 1。 我怀疑 $this->Entity->save($entity) 会设置 $entity->relation_id,但我不想保存它。

修复它的一种方法是:

    $entity->set(['related_id' => $related->id,'related',$related]);

这看起来不是很优雅?

解决方法

在 CakePHP 中没有等效的速记方法。

虽然 belongsToManyhasMany 关联有 the link() and unlink() methods 来关联和保存实体,但 belongsTohasOne 没有类似的(尚)。>

所以现在你必须手动在正确的属性上设置实体,然后保存源实体,例如:

$entity = $this->Table->newEmptyEntity(); // or $this->Table->get(1); to update
$entity->set('related',$this->Related->get(1));
$this->Table->save($entity);

保存后,源实体将保存新关联记录的外键。如果您实际上不想保存它(无论出于何种原因),那么您别无选择,只能在实体上手动设置外键,或者实现您自己的知道关联配置的辅助方法,因此它会知道要填充哪些属性。

只是为了让您开始使用一些东西,在基于自定义 \Cake\ORM\Association\BelongsTo 的关联类中,这可能如下所示:

public function associate(EntityInterface $source,EntityInterface $target)
{
    $source->set($this->getProperty(),$target);

    $foreignKeys = (array)$this->getForeignKey();
    $bindingKeys = (array)$this->getBindingKey();
    foreach ($foreignKeys as $index => $foreignKey) {
        $source->set($foreignKey,$target->get($bindingKeys[$index]));
    }
}

然后可以像这样使用:

$entity = $this->Table->newEmptyEntity();
$this->Table->Related->associate($entity,$this->Related->get(1));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...