2017-06-12 21 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

    我編輯我的答案以反映這些信息 –