2017-06-02 56 views
1

我想弄清楚Eloquent是如何工作的以及使用普通sql查詢的優點(在columA.id = columnB.id上連接A和B表... )Laravel>使用雄辯查詢多對多關係

我有兩個型號:頻道和子類別的許多一對多的關係

我創建了一個channel_subcategory透視表和addded這樣的關係:

public function up() 
{ 
    Schema::create('channel_subcategory', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->timestamp('created_at')->useCurrent(); 
     $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); 
     $table->integer('channel_id')->unsigned()->nullable(); 
     $table->foreign('channel_id')->references('id')->on('channels')->onDelete('cascade'); 
     $table->integer('subcategory_id')->unsigned()->nullable(); 
     $table->foreign('subcategory_id')->references('id')->on('subcategories') ->onDelete('cascade'); 
    }); 
} 


I want to get one channel given the slug property and the subcategories it belongs to. So I did this in the ChannelController.php 

public function show($slug) 
{ 
    $channel = Channel::where('channels.slug', '=', $slug)->first(); 
    foreach ($channel as $subcategory) { 
     echo $subcategory->title; 
    } 
} 

I get the error: 

ErrorException in ChannelController.php line 107: Trying to get property of non-object 


All I want is to show the channel name and the categories it belongs to. 

我已經閱讀了大量的博客,包括Laravel文檔,他們總是解釋遷移,如何建立模型中的關係(歸屬),甚至保存相關數據。但是我找不到一個描述(用於假人),現在可以從兩個表中獲取一些數據,例如:

  • 獲取一個通道所屬的所有類別。
    • 得到所有的信道在一個類中
    • 得到屬於多個類別
    • 與更多的渠道獲得該類別的所有通道。

換句話說,如何做到這一點的純解釋。

編輯 添加我的信道模型

public function subcategory() 
{ 
    return $this->belongsToMany('App\Subcategory')->withTimestamps(); 
} 

回答

1

你需要定義你的模型之間的關係。在你的情況下,你應該在Channel模型中創建一個subcategories關係。

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

SubCategory更改爲您所命名的任何模型。

然後在你的控制器,你可以像這樣訪問

$channel = Channel::where('slug', $slug)->first(); 

foreach ($channel->subcategories as $subcategory) { 
    echo $subcategory->title; 
} 

的關係,雖然上面的代碼工作,你應該如果你要總是急於負載需要的關係數據。這可以防止N + 1查詢問題。

$channel = Channel::with('subcategories')->where('slug', $slug)->first(); 
+0

我用我的頻道模型編輯了我的問題。那是不正確的? 如果我「var_dump」我得到我看到通道的名稱,也是類別的名稱屬於。我認爲我的問題是試圖迴應子類別的名稱。因此它說:試圖獲得非對象的屬性 –

+0

您的問題中的循環循環通過不是子類別的「$通道」。檢查我顯示的循環。還修復了我的代碼中的關係。從示例中更改關係字段時,我犯了一個錯誤。 – Sandeesh

+0

謝謝你!!!它嘗試了幾天後才起作用!順便說一句:你知道任何教程,我可以得到解釋和建立這樣的查詢,我發佈? (所有類別的頻道,更多頻道的類別,頻道和類別等)?我接受你的答案。再次感謝 –