首页 > 解决方案 > 查询与 slug 而不是 id 的 hasMany 关系?

问题描述

我正在尝试基于 slug 查询一个类别及其所有频道。

作品

\App\Category::find(1)->channels()->get();

不工作

\App\Category::where('slug','animals')->channels()->get()

带有消息的 BadMethodCallException 'Method Illuminate/Database/Query/Builder::channels 不存在。'

类别模型上的关系

public function channels()
{
    return $this->hasMany(Channel::class,'category_id');
}

标签: laravellaravel-5eloquent

解决方案


假设您在迁移和模型属性中正确设置了slug字段(从异常消息中看起来像这样)。

正在做

\App\Category::find(1)->channels()->get();

在引擎盖下相当于

\App\Category::where('category_id', 1)->first()->channels()->get();

因此,您需要的是get实际执行查询的类别,然后能够从水合模型中检索通道。

\App\Category::where('slug', 'animals')->first()->channels()->get();

应该工作以及

\App\Category::where('slug', 'animals')->first()->channels; // calling as attribute will perform the get() on the relationship

另请注意,您可能会利用其他方法,例如with()预先加载关系,first()执行获取并确保您只获取一个实例,并将关系调用为属性,如上所示。参考文档


推荐阅读