如何加载最新记录,其中每个记录具有不同的某列值?

时间:2014-07-22 09:50:00

标签: php laravel laravel-4 eloquent

我们说这个名为消息

的表格
+----+--------------+-------------+-----+
| ID | user_id      | conv_id     |body |
+----+--------------+-------------+-----+
|1..5|            1 |           1 | ... |
+----+--------------+-------------+-----+
| 6  |            1 |           3 | ... |
+----+--------------+-------------+-----+
|  7 |            1 |           3 |...  |
+----+--------------+-------------+-----+
|  8 |            1 |           1 |...  |
+----+--------------+-------------+-----+
|  9 |            1 |           2 |...  |
+----+--------------+-------------+-----+
| 10 |            1 |           1 | ... |
+----+--------------+-------------+-----+
| 11 |            1 |           2 |...  |
+----+--------------+-------------+-----+ 
| 12 |            1 |           4 |...  |
+----+--------------+-------------+-----+
| 13 |            1 |           5 |...  |
+----+--------------+-------------+-----+
| 14 |            1 |           4 |...  |
+----+--------------+-------------+-----+

我想输出这个结果:

+----+--------------+-------------+-----+
|2..5|            1 |           1 | ... |
+----+--------------+-------------+-----+
| 10 |            1 |           1 | ... |
+----+--------------+-------------+-----+
|  7 |            1 |           3 | ... |
+----+--------------+-------------+-----+
| 11 |            1 |           2 | ... |
+----+--------------+-------------+-----+
| 13 |            1 |           5 |...  |
+----+--------------+-------------+-----+
| 14 |            1 |           4 |...  |
+----+--------------+-------------+-----+

是急切加载的结果。正如您所看到的,它会输出5条最新记录,其中conv_id = 1 加上每个其他conv_id 的最新记录。我该怎么做?


这是我的控制器代码和我尝试过的内容

$loginuser = User::find(Auth::user()->id);

//$allOpenConvMsgs is an array of 5 message IDs where `conv_id = 1`.
//The relationship between user and messages is many-to-many. 
  See model codes below

$newMessages = $loginuser->messages()->where(function($q){
                   $q->where(''); //I'm stuck here!
               })->orWhereIn('messages.id',$allOpenConvMsgs);

消息模型

public function user(){
    return $this->belongsToMany('User');
}

用户模型

public function messages(){
    return $this->belongsToMany('Messages');
}

1 个答案:

答案 0 :(得分:-1)

如果我明白你的意思,你可以这样做:

$loginuser = User::find(Auth::user()->id)->with(array('messages' => function($q){
    $q->where('conv_id', '=', '1')->take(5)->orderBy('id', 'desc');
})->get();

$newMessages = $loginuser->messages;

<强>更新

根据David的建议,最好通过User函数使用已经获取的Auth::user()实例。

所以上面的代码将是:

$newMessages = Auth::user()->load(array('messages' => function($q){
        $q->where('conv_id', '=', '1')->take(5)->orderBy('id', 'desc');
    }))->messages;

更新2

以上代码仅获取conv_id = 1的邮件,以获取您必须删除的所有最新邮件where条件:

$newMessages = Auth::user()->load(array('messages' => function($q){
            $q->take(5)->orderBy('id', 'desc');
        }))->messages;