【发布时间】:2021-10-13 14:49:06
【问题描述】:
我经常有两个模型处于 1:x 关系:
class Child extends Model
{
public function parent()
{
return $this->belongsTo(Parent::class);
}
}
现在有时我已经在函数中拥有一个相关模型的实例:
function f(Parent $parent): Child
{
// ...
$child = $parent->createChild();
// ...
return $child
}
不同的函数将Child 作为参数并需要Parent 类的属性:
function g(Child $child)
{
$child->update([
'attribute' => h($child->parent->attribute)
]);
}
现在如果使用从f 返回的Child 实例调用g,那么将从数据库中检索两次Parent 实例。除非我们添加Parent 参数并将实例传递给g,或者修改f 如下:
function f(Parent $parent): Child
{
// ...
$child = $parent->createChild();
// ...
$child->parent = $parent;
return $child
}
我更喜欢第二种方法来添加另一个参数,因为调用g 的上下文可能无法访问Parent 实例。它通常工作正常。但是,它在g 中的更新语句上失败:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'parent' in 'field list' (SQL: update `children`...
所以我的问题是:
有没有办法将现有模型实例插入到适当的关系中,而无需模型将分配注册为列更新?
【问题讨论】:
-
->setRelation? -
^^ 我的想法完全是另外
->associate($model)用于多态 -
这是真的
public function child()吗? child belongsTo child 或 child belongsTo paren -
@A.ANoman 不,很好,已修复。
标签: php laravel eloquent laravel-8 database-relations