在 Laravel 4.2 中连接表 雄辩


Joining Tables in Laravel 4.2 Eloquent

我不太擅长使用Laravel Eloquent进行查询。我有两张桌子

stories table
------------------------------------------------------------------
 id |   title   |   body   | author_id |...
------------------------------------------------------------------
 1  | Story 1   | Once a.. |  2
 2  | Story 2   | There is |  4
 3  | Something | You are. |  2
 activities table
------------------------------------------------------------------
 id | story_id | liker_id |...
------------------------------------------------------------------
 1  | 2        | 2

在这里,author_idliker_id实际上是user_id。我想让特定用户创作和喜欢的故事,以在他的个人资料中显示这些故事。

我想使用雄辩的ORM。我使用查询生成器尝试了这样的事情

 $stories = DB::table('stories')
                ->join('activities', function($join)
                {
                  $join->on('stories.author_id', '=', 'activities.liker_id')
                })
                ->where('stories.author_id', $author_id)
                ->get();
 return $stories;

我可以通过join获取特定liker_idstory_id,但无法使用单个查询中的story_idstories表中获取详细信息。

这是使用查询构建器获取特定用户创作和喜欢的故事的简单方法

$author_id = 1;
$stories = DB::table('stories')
            ->join('activities', 'stories.author_id', '=', DB::raw('activities.liker_id AND stories.id = activities.story_id'))
            ->Where('stories.author_id', $author_id)
            ->get();
//select * from `stories` inner join `activities` on `stories`.`author_id` = activities.liker_id AND stories.id = activities.story_id where `stories`.`author_id` = 1"

使用雄辩,您可以执行以下操作创建2模型文件 1. 故事模型(故事.php( 2. 活动模型(活动.php( 故事.php

class Story extends Eloquent {
    public function activities()
    {
        return $this->hasMany('Activity');
    }
}

活动.php

class Activity extends Eloquent {
    public function story()
    {
        return $this->belongsTo('Story');
    }
}

而不是您可以在故事中编写函数以根据需要获取数据

$stories = Story::with('activities')
                    ->where(DB::raw('stories.id = activities.story_id'))
                    ->Where('stories.author_id', $author_id)
                    ->get();
// haven't tested with eloquent but it should work