Associate/Dissociate(新)实体上的相关实体

Associate/Dissociate related entity on (new) entity

有没有办法在 CakePHP4.x 中将一个实体 associate/dissociate 到另一个实体? 类似于 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 中没有等效的 shorthand 方法。

虽然 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 的关联 class 中,它可能看起来像这样:

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));