问题描述
有没有办法在 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 中没有等效的速记方法。
虽然 belongsToMany
和 hasMany
关联有 the link()
and unlink()
methods 来关联和保存实体,但 belongsTo
或 hasOne
没有类似的(尚)。>
所以现在你必须手动在正确的属性上设置实体,然后保存源实体,例如:
$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));