首页 > 解决方案 > Laravel 6 id 按关系排序后更改

问题描述

我不知道怎么解释...

在修补匠上:

$m = App\Models\Mobiliari::Buscar('5')
$m->get()
=> Illuminate\Database\Eloquent\Collection {#3038
     all: [
       App\Models\Mobiliari {#3051
         id: "5",
         entitat_id: "3",
         tipus_mobiliari_id: "2",
         descripcio: null,
         data_compra: null,
         proveidor_id: "2",
         factura: null,
         cost: ".0000",
         ubicacio_id: "2",
       },
     ],
   }

Buscar 是一个过滤某些字段的函数:

public function scopeBuscar($query, $filtre)
    {
        if ($filtre)
        {
            return $query->where('mobiliari.id', $filtre)
                ->orWhere('descripcio', 'like', '%'.$filtre.'%')
                ->orWhereHas('Entitat', function($q) use ($filtre) {
                    $q->where('entitat', 'like', '%'.$filtre.'%');
                })
                ->orWhereHas('TipusMobiliari', function($q) use ($filtre) {
                    $q->where('tipus', 'like', '%'.$filtre.'%');
                })
                ->orWhereHas('Proveidor', function($q) use ($filtre) {
                    $q->where('proveidor', 'like', '%'.$filtre.'%');
                })
                ->orWhereHas('Ubicacio', function($q) use ($filtre) {
                    $q->where('edifici', 'like', '%'.$filtre.'%')
                        ->orWhere('ubicacio', 'like', '%'.$filtre.'%');
                });
        }
    }

然后,当尝试通过相关表对结果进行排序时,ID 更改 te 值

$m->join('entitat', 'mobiliari.entitat_id', '=', 'entitat.id')->orderBy('entitat.entitat','asc')->get()
=> Illuminate\Database\Eloquent\Collection {#3041
     all: [
       App\Models\Mobiliari {#3040
         id: "3",
         entitat_id: "3",
         tipus_mobiliari_id: "2",
         descripcio: null,
         data_compra: null,
         proveidor_id: "2",
         factura: null,
         cost: ".0000",
         ubicacio_id: "2",
         entitat: "UAB Idiomes",
         rao_social: "Escola d'Idiomes Moderns Casa Convalescència SL",
       },
     ],
   }

我捕获了使用 DB::enableQueryLog(); 生成的查询 和 dd(DB::getQueryLog()),在 de SQL Server 上执行它并返回正确的 ID ...

任何人都知道或可以解释为什么 ID 会发生变化?

标签: laraveljoin

解决方案


当您连接表时,id 可能不明确,并且LaravelORM 甚至会从您的连接中获取其中一个 id。

在当前表中添加 select() 将帮助您解决问题。如果需要,您仍然可以选择额外的列,但如果使用其他表中的 id 重命名SQL.

->select('mobiliari.*');

所以试试下面的代码。

$m->join('entitat', 'mobiliari.entitat_id', '=', 'entitat.id')
    ->orderBy('entitat.entitat','asc')
    ->select('mobiliari.*')
    ->get();

推荐阅读