我可以使用Eloquent通过父母的财产订购一系列儿童吗?

时间:2014-06-18 22:05:21

标签: php laravel-4 eloquent

我有一个东西课:

class Thing extends Eloquent
{
    public function owner() {
        return $this->belongsTo('Owner');
    }
}

所有者类:

class Owner extends Eloquent
{
    public function things() {
        return $this->hasMany('Thing');
    }
}

我正在获得这样的事物的某些属性所订购的事物的分页列表:

Thing::orderBy('thing_property')->paginate(20);

但我意识到我想获得由其所有者的财产订购的物品清单。有没有雄辩的方法来做到这一点?我尝试了很多不同的事情但没有成功。我应该包括一些我在我的问题中尝试过的东西,但是它们中有很多,其中大部分可能都是愚蠢的,我甚至不知道它们中的任何一个是否接近。最近的一个是:

Thing::with('owner')->orderBy('owner.owner_property')->paginate(20);

在那之后不工作并阅读更多关于它的内容,我发现这并不是应该如何使用'with()'。不幸的是,我无法找到任何关于我应该使用的内容。

2 个答案:

答案 0 :(得分:2)

您需要加入所有者的表格。预先加载(with)不会加入,但会为相关模型运行另一个查询。

$things = Thing::join('owners', 'owners.id', '=', 'things.owner_id')
              ->orderBy('owners.owner_property')
              ->get(['things.*']); // return only columns from things

如果您有Thing行没有Owner(owner_id = null),请使用leftJoin代替join

答案 1 :(得分:0)

看起来你对Laravels Eloquent ORM有了很好的基本把握。

如果您希望things根据其父owner获得订单,我会建议以下内容:

$results = Owner::with('things')
    ->orderBy('owner_property', 'ASC')
    ->paginate(20);

或者,如果您想订购父owner,然后订购子things,您可以执行以下操作:

$results = Owner::with(array( 'things' => 
    function($query){
        $query->orderBy('things_property', 'DESC');
    })
    ->orderBy('owner_property', 'ASC')
    ->paginate(20);