通过自己获取帖子和所有帖子跟随附加用户使用with()或连接并通过post created_at命令

时间:2014-01-28 21:43:33

标签: laravel-4 eloquent

我从本教程开始遵循系统设置。 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

1 个答案:

答案 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,以便返回一个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即可找到当前用户。

希望有所帮助! :)