如何将该SQL语句转换为Laravel 5.5的Query Builder写法
把原生SQL转换为Laravel Query Builder写法
没问题,我来帮你把这条原生SQL转换成Laravel Query Builder的写法,这样既符合Laravel的编码规范,也能方便你利用框架的各种特性~
首先先拆解下你的原生SQL逻辑:通过关联categorias、objetos、detalle_donativo_realizados和donativo_realizados四张表,筛选出指定donativo_realizados.id对应的分类、物品、捐赠详情等信息。
下面是对应的Query Builder实现:
use Illuminate\Support\Facades\DB; // 替换成你实际的ID值 $targetId = 1; $donationDetails = DB::table('categorias as c') // 关联categorias和objetos表 ->join('objetos as o', 'c.id', '=', 'o.categoria_id') // 关联objetos和detalle_donativo_realizados表 ->join('detalle_donativo_realizados as ddr', 'o.id', '=', 'ddr.objeto_id') // 关联detalle_donativo_realizados和donativo_realizados表 ->join('donativo_realizados as dr', 'ddr.donativoRealizado_id', '=', 'dr.id') // 指定要查询的字段及别名 ->select( 'c.nombreCategoria as categoria', 'o.nombre as articulo', 'ddr.descripcion', 'ddr.talla_id', 'ddr.cantidad' ) // 过滤指定的donativo_realizados ID ->where('dr.id', $targetId) // 获取结果集,如果只需要单条可以用first() ->get();
进阶:用Eloquent关联简化写法
如果你已经为这几张表创建了对应的Eloquent模型(比如Categoria、Objeto、DetalleDonativoRealizado、DonativoRealizado),并且定义了正确的关联关系,还可以用更简洁的Eloquent写法:
假设模型关联如下:
Categoria模型:public function objetos() { return $this->hasMany(Objeto::class); }Objeto模型:public function detalleDonativos() { return $this->hasMany(DetalleDonativoRealizado::class, 'objeto_id'); }DetalleDonativoRealizado模型:public function donativoRealizado() { return $this->belongsTo(DonativoRealizado::class, 'donativoRealizado_id'); }
那么可以这样查询:
use App\Models\Categoria; $targetId = 1; $donationDetails = Categoria::select( 'categorias.nombreCategoria as categoria', 'objetos.nombre as articulo', 'detalle_donativo_realizados.descripcion', 'detalle_donativo_realizados.talla_id', 'detalle_donativo_realizados.cantidad' ) ->join('objetos', 'categorias.id', '=', 'objetos.categoria_id') ->join('detalle_donativo_realizados', 'objetos.id', '=', 'detalle_donativo_realizados.objeto_id') ->whereHas('objetos.detalleDonativos', function ($query) use ($targetId) { $query->where('donativoRealizado_id', $targetId); }) ->get();
这样的写法更贴合Laravel的ORM设计,也更易于维护~
内容的提问来源于stack exchange,提问作者Alonso Lambent
相关产品推荐
相关产品推荐

