2017-06-12 24 views
0

我Laravel应用有三个型号查询具有一对多,尽管在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) 

雄辩的假设在通道和子类别之间存在一对多并忽略数据透视表

我的问题是:

  1. 是否有解决方案使用雄辩?与中间的数据透视表有许多关系?
  2. 使用普通的MySQL,如何刚刚得到了所有的通道列表,但我不知道如何将它们分成不同的子类别。任何帮助?

编辑澄清:

  • 我试图通过四个表在这里查询: 类别,子类别,CHANNEL_SUBCATEGORY和频道

  • 我想要查找按子类别分组的类别中的频道。 (频道和子类别有多对多的关系)

  • 回答

    0

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

    所以,你要告诉laravel如何处理你们之间的关系:

    在您的类别型号:回复后

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

    编辑:

    那好吧关系不是hasManyThrough,但一个属于:

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

    默认情况下,laravel将搜索h为category_id foreign_key,但是当您将其重命名为subcategory_id时,您必须指定所有关系

    +0

    我的频道表没有category_id,它也没有subcategory_id。因为是多对多的关系。我有一个channel_subcategory PIVOT表,其中有两个外键:subcategory_id和channel_id –

    +0

    我编辑我的答案以反映这些信息 –