Laravel Eloquent - orderBy列在相关模型中查找

时间:2017-02-05 14:17:18

标签: eloquent laravel-5.2

INFORMATIONS

数据库

events        | id | to_user_id    | from_user_id |
event_details | id | event_id      | when         |

Event.php

class Event extends Eloquent {

protected $table = 'events';

public function event_detail() {
    return $this->hasOne('EventDetail');
}}

EventDetail.php

class EventDetail extends Eloquent {

protected $table = 'event_details';

public function event() {
    return $this->belongsTo('Event', 'event_id');
}}

问题

我希望得到所有事件(事件模型)并按相关EventDetail模型中的'when'列排序。我写了一个查询,它的确有效:

$event = Event::join('event_details as p', 'p.event_id', '=', 'event.id')
                    ->orderBy('p.when', 'asc')
                    ->select('events.*')
                    ->with('event_detail')
                    ->get();

但是当我想添加->where('to_user_id', '=', 0)子句时,我会收到错误。 我该如何解决?

此外,我想知道如果这个查询在正确的做法中是正确的吗? 你能写得更好吗?

2 个答案:

答案 0 :(得分:2)

好的,必须重新创建你的项目/表格 所有测试都运行正常,但我注意到你可能会考虑改变一些事情。

$events = Event::with(['event_detail'=> function($query) {
    $query->orderBy('when', 'asc');
}])
->where('to_user_id', 0)
->get();

如果您有活动

,您的代码可能会更好
public function event_detail(){
    //considering you will have multiples? or just the one event detail?
    return $this->hasMany('EventDetail');
}

正如您所看到的,我存储的一个事件有2个事件详细信息&他们都是由ASC订购的。 enter image description here

您可以使用不使用'with()'的其他方法,但我更喜欢它。非常适合json结果,你可以菊花链接很多相关的模型。

希望这有帮助

答案 1 :(得分:0)

我用这个查询解决了这个问题。我应该添加->where('events.to_user_id', '=', 0)所以

$event = Event::join('event_details as p', 'p.event_id', '=', 'event.id')
                ->orderBy('p.when', 'asc')
                ->select('events.*')
                ->where('events.to_user_id', '=', 0)
                ->with('event_detail')
                ->get();

但是,我想知道这个查询是否正确并且有良好的做法? 你能写得更好吗?