【问题标题】:Is there a way to get around using custom route key to load eloquent relationships in laravel有没有办法使用自定义路由键在 laravel 中加载雄辩的关系
【发布时间】:2020-03-26 06:55:48
【问题描述】:

我有两个模型产品和图像。我将产品模型上的路由键名称更改为使用 slug 字段,现在我无法加载与图像模型的 hasMany 关系

这是产品模型

class Product extends Model
{
    protected array $with = ['images'];

    public function getKeyName()
    {
        return 'slug';
    }

    protected array $guarded = [];


    public function images() : HasMany
    {
        return $this->hasMany(Image::class, 'product_id');
    }
}

和图像模型


class Image extends Model
{
    protected array $guarded = [];

    public function image() : BelongsTo
    {
        return $this->belongsTo(Product::class);
    }
}

所以当我尝试时

    Product::first()->images

它只是返回一个空集合 但不覆盖getKeyName() 方法,一切正常

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    getKeyName() 将获取模型的主键。支持返回id,修改为slug后返回slug

    还有hasManyHere's the source code; 第三个参数LocalKey为空时会使用getKeyName()

    如果你还想使用hasMany,你需要像这样传递第三个参数:

    public function images()
    {
        return $this->hasMany(Image::class, 'product_id', 'id');
    }
    

    这会将 Eloquent 查询转换为数据库查询,这将采用正确的本地键 products.id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 2018-04-13
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多