如何解决传递给 Eloqent `Model::load()` 的关系的正确名称是什么?
我必须模拟 Photo
和 SizeVariant
。一张照片有许多尺寸变体,一个尺寸变体只有一张照片作为其所有者。 DB 的表遵循 Eloquents 命名方案,称为 photos
和 size_variants
。
我的模型看起来像这样(缩短):
class Photo extends Model {
protected $with = [ 'size_variants' ];
public function sizeVariants(): HasMany {
return $this->hasMany(SizeVariant::class);
}
}
class SizeVariant extends Model {
protected $with = ['photo'];
protected $touches = ['photo'];
public function photo(): BelongsTo {
return $this->belongsTo(Photo::class);
}
}
但是,当我尝试在现有的 $photo->load('size_variants)
对象上调用 $photo
时,我收到一个 Illuminate\Database\Eloquent\RelationNotFoundException
异常并带有消息 Call to undefined relationship [size_variants] on model [App\Models\Photo]
。
关系的正确名称是什么?我认为命名方案会遵循 Laravel 通常的模式,而 Laravel 会神奇地在蛇和骆驼案例之间进行映射。
我已经尝试了大写、蛇和骆驼大小写以及复数与单数的所有组合,即 $photo->load('size_variants')
、$photo->load('size_variant')
、$photo->load('sizeVariants')
、$photo->load('sizeVariant')
、{{1 }} 和 $photo->load('SizeVariants')
。
解决方法
在 with
或 load
上下文中传递的关系名称应与您在模型中定义的关系名称相匹配,在您的情况下应为 sizeVariants
。
另一方面,我也会小心谨慎,通过在两个模型上定义 protected $with
属性,总是急切地加载两个关系。您最终会遇到超时,因为:您的 Photo 模型会急切加载 SizeVariant 模型,这会急切加载 Photo 模型,这会急切加载 SizeVariant 模型,这会急切加载 Photo 模型等。
您应该删除 protected $with
属性并在查询中使用 with
或在需要相关模型时在模型中使用 load
以避免这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。