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 方法。
虽然 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
的关联 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));
有没有办法在 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 方法。
虽然 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
的关联 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));