Laravel / Eloquent - 在不使用表名的情况下按模型关系排序

时间:2014-08-17 13:58:56

标签: php postgresql laravel-4 eloquent

我有一个Person雄辩的模型belongsToAddress。我的Laravel版本是4.2.5,我正在使用PostgreSQL。

class Person extends Eloquent {
    public function address() {
        return $this->belongsTo('Address');
    }
}

我的目标是获取Person资源的集合,这些资源按其相关Address模型的address_1字段排序。

我可以通过引用表名来实现这一点,如下所示,但我想用Eloquent关系来做,因为我不想处理用于抽象的表。

Person::join('addresses', 'persons.id', '=', 'addresses.person_id')
    ->orderBy('address_1', 'asc')->get();

我尝试了以下Eloquent方法但没有成功。

Person::with('address')->whereHas('address', function($q)
    {
        $q->orderBy('address_1', 'asc');
    })->get();

此查询失败,并显示错误消息:

Grouping error: 7 ERROR:  column \"addresses.address_1\" must appear in the 
GROUP BY clause or be used in an aggregate function

为此,我尝试在orderBy语句上方添加此行,这会导致查询成功,但排序对生成的Person集合没有影响。

$q->groupBy('address_1');

我非常感谢一个解决方案,如果可能的话,我不必引用表名。我已经用尽了这个主题的所有资源,但这肯定是一个常见的用例。

1 个答案:

答案 0 :(得分:5)

你走了:

$person = new Person;
$relation = $person->address();
$table = $relation->getRelated()->getTable();

$results = $person->join(

 $table, $relation->getQualifiedForeignKey(), '=', $relation->getQualifiedOtherKeyName()

)->orderBy($table.'.address_1', 'asc')
 ->get();