如何在与Laravel Eloquent方法WITH连接的元素上使用orderby

时间:2018-03-10 18:18:47

标签: php mysql laravel eloquent

问题是查询无法找到应该与Laravel Eloquent中的方法WITH连接的specific_method(specific_method,specific_model,SpecificModel,specificMethod等...)。任何想法如何解决? 我的代码:

//SpecificModel
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class SpecificModel extends Model {

    protected $guard_name = 'web';
    protected $table = 'SpecificTable';
    protected $guarded = ['id'];

    public function specificMethod(){
        return $this->belongsTo('App\Models\AnotherModel','AnotherModel_id');
    }
}


//AnotherModel
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class AnotherModel extends Model {

    protected $guard_name = 'web';
    protected $table = 'AnotherTable';
    protected $guarded = ['id'];
}

//Query method
$model = app('App\Models\SpecificModel');
$query = $model::with('specificMethod:id,title');
$query = $query->orderBy('specific_method.title','desc');
return $query->get();


//Error
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'"specific_method.title"' in 'order clause' (SQL: select * from 
`SpecificModel` where `SpecificModel`.`deleted_at` is null order by 
`specific_method`.`title` desc)

1 个答案:

答案 0 :(得分:0)

这是因为belongsTo关系没有像你期望的那样执行join查询(正如你从错误中看到的那样)。它执行另一个查询以获取相关模型。因此,您将无法按相关模型列订购原始模型。

基本上,有2个查询发生:

  1. 使用SELECT * from originalModel ...*

  2. 获取原始模型
  3. 使用SELECT * from relatedModel where in id (originalModelForeignKeys)

  4. 获取相关模型

    然后Laravel做了一些魔术并将第二个查询中的模型附加到第一个查询中的正确模型。

    您需要执行实际join才能按照您希望的方式订购。