2016-04-04 105 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),...中执行此操作? –