微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

传递给 Eloqent `Model::load()` 的关系的正确名称是什么?

如何解决传递给 Eloqent `Model::load()` 的关系的正确名称是什么?

我必须模拟 PhotoSizeVariant。一张照片有许多尺寸变体,一个尺寸变体只有一张照片作为其所有者。 DB 的表遵循 Eloquents 命名方案,称为 photossize_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')

解决方法

withload 上下文中传递的关系名称应与您在模型中定义的关系名称相匹配,在您的情况下应为 sizeVariants

另一方面,我也会小心谨慎,通过在两个模型上定义 protected $with 属性,总是急切地加载两个关系。您最终会遇到超时,因为:您的 Photo 模型会急切加载 SizeVariant 模型,这会急切加载 Photo 模型,这会急切加载 SizeVariant 模型,这会急切加载 Photo 模型等。

您应该删除 protected $with 属性并在查询中使用 with 或在需要相关模型时在模型中使用 load 以避免这种情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。