2016-04-04 147 views
1

我的數據庫結構如下:Laravel雄辯複雜的連接語句

Relation blogger <-> Topics

所以,我已經有了一個博客表(對不起,圖像中的錯字),其中有3 領域的話題,全部3個都是外鍵主題'表號碼

我用一張顯示所有博客列的簡單表格製作了一個Blogger視圖前端。目前,主題的ID正在顯示,而不是名稱。

我該如何改變這種情況? 我已經在我的控制器中嘗試了以下內容,但是在main_topic列中只是在視圖中使用不同的值創建了重複項。

$bloggers= DB::table('bloggers') 
      ->join('topics', function ($join) { 
       $join 
        ->on('bloggers.main_topic', '=', 'topics.id') 
        ->orOn('bloggers.subtopic1', '=', 'topics.id') 
        ->orOn('bloggers.subtopic2', '=', 'topics.id'); 
      }) 
      ->select('bloggers.*', 'topics.name as main_topic') 
      ->get(); 

return view('pages.bloggers', compact('bloggers')); 

回答

1

回答我的具體問題是,從給出的答案有點不同,所以我將它張貼在這裏萬一有人需要它的未來。

所以我有3個表:博客主題和數據透視表名爲blogger_topic博客包含3個外鍵(整數)的主題叫main_topicsubtopic1subtopic2。數據透視表包含blogger_idtopic_id

我最終什麼了:

Blogger.php型號:

public function mainTopic() 
{ 
    return $this->belongsTo('App\Models\Topic', 'main_topic', 'id'); 
} 
public function subtopicOne() 
{ 
    return $this->belongsTo('App\Models\Topic', 'subtopic1', 'id'); 
} 
public function subtopicTwo() 
{ 
    return $this->belongsTo('App\Models\Topic', 'subtopic2', 'id'); 
} 

Topic.php型號:

public function bloggers() 
{ 
    return $this->belongsToMany('App\Models\Blogger'); 
} 

視圖(blogger.blade。php):

@foreach($bloggers as $blogger) 
    {{ $blogger->mainTopic }} 
    {{ $blogger->subtopicOne }} 
    {{ $blogger->subtopicTwo }} 
@endforeach 
0

我想你應該改變,如果可能的數據庫表如下(樣本鏈接),通過創建一個數據透視表。然後我認爲你應該在Blogger和主題模型文件中建立多對多的關係。然後,獲取所有相關主題將非常簡單。對於例如,

$topics = $blogger->topics; 

Here you can reference the sample db table designs

我好心建議你使用模型Laravel怎麼把它們會讓你的生活變得更加簡單。希望這個幫助。

+0

我想使用模型,雖然我不是_that_熟悉與Laravel,所以我只是遵循該文件。抓取你建議的主題是行不通的,還有其他想法? –

0

如果你不能改變你的數據庫,你可以在結果上使用group_concat。不知道這是否會工作,但這樣的:

DB::table('bloggers') 
      ->join('topics', function ($join) { 
       $join 
        ->on('bloggers.main_topic', '=', 'topics.id') 
        ->orOn('bloggers.subtopic1', '=', 'topics.id') 
        ->orOn('bloggers.subtopic2', '=', 'topics.id'); 
      }) 
      ->groupby('bloggers.id') 
      ->select('bloggers.*', 'topics.name as main_topic', DB::raw('group_concat(topics.name)')) 
      ->get(); 
+0

我將數據庫更改爲包含博主和主題的數據透視表。另外,組concat並不是我正在尋找的,因爲我只是試圖從Bloggers表('main_topic','subtopic1','subtopic2')映射它們各自名稱的3列。 –

+0

如果您有數據透視表,則可以在博客和主題之間創建多對多的雄辯關係。 在博主模型中加入: 'public function topics(){ \t \t return $ this-> belongsToMany('App \ Topic','pivot_table_name'); }' 而在主題模型,把這個: '公共功能的博客(){ \t \t回$這個 - > belongsToMany( '應用程序\博客', 'pivot_table_name'); }' 數據透視表應包含以下內容: 'blogger_id' 'topic_id' 您可以從博客中刪除模式的主題列。然後你可以通過'$ blog-> topics()'引用這些主題; –

+0

做過所有你說的事情,但我似乎無法弄清楚在哪裏做'$ blogger-> topics()'語句。我是否在我的控制器,刀片(HTML),...中執行此操作? –