我从本教程开始遵循系统设置。 Creating the Twitter following model in Laravel 4
它适用于追随者和追随者以及拯救他们。但我想列出我关注的所有帖子和所有帖子,以及每个帖子的相关用户对象,并通过帖子created_at列对它们进行排序。
不要试图选择一些代码来显示我尝试过的内容,而只是说我花了两天时间尝试join(),leftJoin(),嵌套连接,where()或者Where()的每个组合,嵌套wheres ,with(),join和wheres嵌套在with()中,我能想到,我只是想不出来。
对于以下内容,我有一个带有user_id和follow_id的数据透视表。以下是我的用户模型中的关系。
/**
* User following relationship
*/
public function follows()
{
return $this->belongsToMany('User', 'user_follows', 'user_id', 'follow_id')
->withTimestamps();
}
/**
* User followers relationship
*/
public function followers()
{
return $this->belongsToMany('User', 'user_follows', 'follow_id', 'user_id');
}
Twit.php模型。 (实际上我的帖子被称为twits但是概念相同)
class Twit extends Eloquent {
protected $fillable = ['twit', 'user_id'];
public function user()
{
return $this->belongsTo('User');
}
}
User.php模型
class Twit extends Eloquent {
protected $fillable = ['twit', 'user_id'];
public function user()
{
return $this->belongsTo('User');
}
}
我试过通过这个谈论自己,但没有一个雄辩的功能似乎做我认为他们应该做的事情。要清楚,这是口头上我需要发生的事情。
通过twits.created_at获取每个twit及其用户和订单 只有在user.id = Auth :: user() - > id的地方 或者user.id在Auth :: user()中的位置 - >跟随
帮助将其写为原始查询也可以。
感谢您的帮助。
更新:删除了我自己的答案,以避免让其他人感到困惑,因为它已经过时并且无法正常工作。
所选答案完美无缺。以下是@philipbrown选择的答案,为用户添加了急切加载,并按twit created_at日期排序
$twits = Twit::whereIn('user_id', function($query)
{
$query->select('follow_id')
->from('user_follows')
->where('user_id', Auth::user()->id);
})->orWhere('user_id', Auth::user()->id)
->with('user')
->orderBy('created_at', 'DESC')
->get();
在视图中
@foreach($twits as $twit)
<li>
<div class="twit-gravitar">
<img src="{{ getGravitar($twit->user->gravitar) }}">
</div>
<div class="twit">
<div class="twit-handle">
{{link_to('/twits/'.$twit->user->username, '@'.$twit->user->username) }}
</div>
<div class="twit-text">{{ $twit->twit }}</div>
</div>
</li>
<hr class="twit-separator">
@endforeach
答案 0 :(得分:4)
我将逐步介绍如何解决这个问题。在将其转换为ORM方法之前,我发现更容易理解原始查询,所以我会写出来,因为我会解决它,而不是仅仅给你答案。
首先我会简单地得到所有twits
(我猜它是twits
?):
SELECT * from twits
接下来我只想从当前用户中选择(以user_id 1为例)来改进这一点:
SELECT * FROM twits WHERE user_id = 1
接下来,我们可以使用SQL子选择来查找当前用户遵循的所有用户:
SELECT * FROM twits WHERE user_id IN (SELECT follow_id FROM user_follows WHERE user_id = 1) OR user_id = 1
现在,如果您在数据库上运行该操作并更改user_id
,则应该获得您期望的twits
流。
现在我们已经对原始查询进行了排序,我们可以将其转换为使用Eloquent,以便返回一个Eloquent Collection
。
同样,首先只需获取所有twits
:
$twits = Twit::all();
接下来我们需要使用whereIn
方法:
$twits = Twit::whereIn('user_id', array(2, 3, 4))->get();
但是我们不需要传递一组用户id,而是传递一个Closure,所以我们可以进行子选择:
$twitss = Twit::whereIn('user_id', function($query)
{
$query->select('follow_id')
->from('user_follows')
->where('user_id', '1');
})->get();
最后,我们可以传入当前用户以包含当前用户的帖子:
$twits = Twit::whereIn('user_id', function($query)
{
$query->select('follow_id')
->from('user_follows')
->where('user_id', '1');
})->orWhere('user_id', '1')->get();
现在,您应该从当前用户和当前用户所关注的所有用户返回Collection
twits
。
最后,您只需将1
替换为Auth::user()->id
即可找到当前用户。
希望有所帮助! :)