【问题标题】:Querying has-many-though in Laravel在 Laravel 中查询 has-many-though
【发布时间】:2017-11-13 16:56:42
【问题描述】:

我的 Laravel 应用程序有三个模型

  1. 类别
  2. 子类别
  3. 频道

类别 - 子类别(一个类别有多个子类别) 子类别 - 渠道(多对多关系)

我有以下关系:

class Category extends Model
{

    public function subcategories()
    {
    return $this->hasMany('App\Subcategory');
    }

    public function channels()
    {
    return $this->hasManyThrough('App\Channel','App\Subcategory');
    }
}


class Subcategory extends Model
{
    public function Category()
    {
        return $this->belongsTo('App\Category');
    }

    public function channels()
    {
        return $this->belongsToMany(Channel::class, 'channel_subcategory', 'channel_id', 'subcategory_id')
->withTimestamps();
    }
}

class Channel extends Model
{
    public function subcategories()
    {
        return $this->belongsToMany(Subcategory::class, 'channel_subcategory', 'channel_id', 'subcategory_id')->withTimestamps();
    }
}

我有 4 张桌子:

  1. 类别
  2. 子类别
  3. channel_subcategory
  4. 频道

我想查询一个类别中的所有频道,按子类别组织。比如:

Category A
    Subcategory A-1
        Channel A-1-1
        Channel A-1-2
    Subcategory A-2
        Channel A-2-1
        Channel A-2-2

鉴于 Category.slug 我在类别控制器中进行了以下查询:

public function show($slug)
{
    $category = Category::with('subcategories')->where('categories.slug', '=', $slug)->first();
    $channels = $category->channels;
    return view('categories.show')->withCategory($category)->withChannels($channels);
}

我收到一条错误消息:

PDOException in Connection.php line 319: 
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channels.subcategory_id' in 'on clause'
(SQL: select `channels`.*, `subcategories`.`category_id` 
from `channels` 
inner join `subcategories` on `subcategories`.`id` = `channels`.`subcategory_id` where `subcategories`.`category_id` = 1)

Eloquent 假设渠道和子类别之间存在一对多,并忽略了数据透视表

我的问题是:

  1. 是否有使用 Eloquent 的解决方案?中间有数据透视表的多层次关系?
  2. 使用普通的 MySQL,如何将频道列表全部放在一起,但我不知道如何将它们分成子类别组。有什么帮助吗?

编辑澄清:

  1. 我在这里尝试通过四个表进行查询: 类别、子类别、CHANNEL_SUBCATEGORY 和频道

  2. 我想在按子类别分组的类别中查找频道。 (渠道和子类别是多对多的关系)

【问题讨论】:

    标签: laravel has-many-through querying


    【解决方案1】:

    我认为您的频道表没有列名 subcategory_id 但 category_id ?

    所以你必须告诉 laravel 如何处理你的关系:

    在您的类别模型中:

    public function channels()
    {
        return $this->hasManyThrough(
            'App\Channel','App\Subcategory',
            'category_id', 'subcategory_id', 'id'
        );
    }
    

    回复后编辑:

    好吧,那么关系不是hasManyThrough,而是a属于:

     public function channels()
     {
        return $this->belongsToMany('App\Channel', 'channel_subcategory', 'channel_id','subcategory_id');
     }
    

    默认情况下,laravel 会搜索 category_id

    【讨论】:

    • 我的频道表没有 category_id,也没有 subcategory_id。因为是多对多关系。我有一个 channel_subcategory PIVOT 表,其中有两个外键:subcategory_id 和 channel_id
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2011-09-23
    相关资源
    最近更新 更多