Laravel Order通过关系


116

我正在遍历特定帖子的作者发布的所有评论。

foreach($post->user->comments as $comment)
    {
        echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

这给我

I love this post (3)
This is a comment (5)
This is the second Comment (3)

我如何按post_id排序,以便上面的列表按3、3、5排序

Answers:


247

可以使用查询功能扩展关系:

<?php
public function comments()
{
    return $this->hasMany('Comment')->orderBy('column');
}

[评论后编辑]

<?php
class User
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

class Controller
{
    public function index()
    {
        $column = Input::get('orderBy', 'defaultColumn');
        $comments = User::find(1)->comments()->orderBy($column)->get();

        // use $comments in the template
    }
}

默认的用户模型+简单的Controller示例;获取评论列表时,只需基于Input :: get()应用orderBy()。(确保进行一些输入检查;))


2
有人已经在Laravel论坛上提出了这个建议,但是我希望能够在Controller中做到这一点,以便我可以根据用户输入选择要排序的字段。可能我应该在问题中更清楚地说明这一点。
2013年

我添加了第二个示例
Rob Gordijn

1
谢谢Rob,您使我走上了正确的轨道。实际的答案是$ comments = User :: find(10)-> comments()-> orderBy('post_id')-> get(); 它似乎需要get()方法才能起作用。如果您可以将get()添加到您的答案中,我会将其标记为接受的答案。
2013年

2
如果您要检索单个记录,则效果很好,但是如果您要检索多个记录,您将需要更多的东西,如stackoverflow.com/a/26130907/1494454
dangel 2015年

如果使用Laravel 5.4,f.ex中默认的mysql严格模式,您将收到SQLSTATE [42000]:语法错误或访问冲突:1140 GROUP列混合...
Sabine

7

我相信您也可以:

$sortDirection = 'desc';

$user->with(['comments' => function ($query) use ($sortDirection) {
    $query->orderBy('column', $sortDirection);
}]);

这使您可以在每个相关注释记录上运行任意逻辑。您可以在其中添加以下内容:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);

1
不。我已经尝试过了,但是没有用。这是我的情况:我有两个表(appointmentsschedules),查询很简单:appointments通过来获取订单schedulesdatetime下降。我有解决方案,方法是在表中添加新列appointmentsdatetime从table 存储schedules。现在我只需要订购appointmentsdatetime我知道这不是最好的方法,但可以解决问题。XD
Fendi Setiawan

非常感谢您,它对我来说非常有效。
Pooria Honarmand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.