【问题标题】:What is the correct name of an relationship which is passed to Eloqent `Model::load()`?传递给 Eloquent `Model::load()` 的关系的正确名称是什么?
【发布时间】:2021-06-19 18:34:36
【问题描述】:

我必须为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 对象上调用 $photo->load('size_variants) 时,我收到带有消息 Call to undefined relationship [size_variants] on model [App\Models\Photo]Illuminate\Database\Eloquent\RelationNotFoundException 异常。

这种关系的正确名称是什么?我认为命名方案将遵循 Laravel 通常的模式,而 Laravel 神奇地映射了蛇和骆驼的情况。

我已经尝试过大写、蛇形和驼峰式以及复数与单数的所有组合,即$photo->load('size_variants')$photo->load('size_variant')$photo->load('sizeVariants')$photo->load('sizeVariant')$photo->load('SizeVariants')$photo->load('SizeVariant')

【问题讨论】:

    标签: eloquent orm eager-loading relation


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2018-08-20
      • 2011-03-03
      • 2020-06-18
      • 2016-12-16
      • 2016-08-16
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多