Laravel 5.7 - 在 when() 函数中高级 where() 查询



我在使用来自多个表单输入的值的查询时遇到问题,每个表单输入都是可选的。

这个想法是找到分配给技术人员的ISP的应用程序(即技术服务,安装等(。

由于输入是可选的,我正在使用->when()函数来避免使用NULL值的查询。

但是我也需要使用技术人员的ID来查找应用程序,该ID与相关的应用程序ID一起存储在数据透视表中。

这是控制器中的代码

$finalizadas = Solicitud::whereHas('tecnicos')
->when($desde, function ($query) use ($desde, $hasta) {
return $query->whereBetween('sol_fecha_finalizada', [$desde, $hasta])->where('sol_estado', 4);
})
->when($tipo, function ($query) use ($tipo) {
return $query->where('sol_tipo_solicitud', $tipo)->where('sol_estado', 4);
})
->when($tecnico, function ($query) use ($tecnico) {
return $query->where('tecnico_tec_id', $tecnico)->where('sol_estado', 4);
})
->when($cliente, function ($query) use ($cliente) {
return $query->where('sol_cliente', $cliente)->where('sol_estado', 4);
})->get();
return view('solicitudes.listar_finalizadas')->with('finalizadas', $finalizadas);

sol_estado = 4 代表应用程序完成。

tecnico_tec_id是数据透视表中技术人员的 IDsolicitud_tecnico

问题是当我尝试按技术人员搜索应用程序时,它会给出下一个错误。

SQLSTATE[42S22]:找不到列:1054 "where 子句"中的未知列"tec_id"(SQL: 从solicitudes中选择 * 存在的位置(从tecnicos中选择* 内联接solicitud_tecnicotecnicos.tec_id=solicitud_tecnico.tecnico_tec_id哪里solicitudes.sol_id=solicitud_tecnico.solicitud_sol_id( 和tec_id= 8 和sol_estado= 4(

这种说法,虽然在关系内部,但行不通

->when($tecnico, function ($query) use ($tecnico) {
return $query->where('tecnico_tec_id', $tecnico)->where('sol_estado',4);
})

但这个就像一个魅力

$finalizadas = Solicitud::whereHas('tecnicos', function ($query) use ($tecnico) {
$query->where('tecnico_tec_id', $tecnico)->where('sol_estado', 4);
})->get();

模范汇票(申请(

<?php
namespace OPyME2;
use IlluminateDatabaseEloquentModel;
class Solicitud extends Model
{
// Nombre de la tabla
protected $table = 'solicitudes';
// Primary key
protected $primaryKey = 'sol_id';
// Marcas de fecha
public $timestamps = false; 
// Columnas
protected $fillable = ['sol_id','sol_fecha_creacion','sol_fecha_traslado','sol_fecha_retiro','sol_fecha_finalizada','sol_horario','sol_cliente','sol_estructura', 'sol_plan', 'sol_escalera', 'sol_tecnico_asignado', 'sol_estado', 'sol_motivo', 'sol_zona_gps', 'sol_telefono_2', 'sol_domicilio_traslado', 'sol_creacion', 'sol_tipo_solicitud', 'sol_pedido_material
'];
// Pivot
public function tecnicos()
{
return $this->belongsToMany('OPyME2Tecnico', 'solicitud_tecnico')
->withPivot('solicitud_sol_id');
}
}

模型技术科(技术员(

<?php
namespace OPyME2;
use IlluminateDatabaseEloquentModel;
class Tecnico extends Model
{
// Nombre de la tabla
protected $table = 'tecnicos';
// Primary key
protected $primaryKey = 'tec_id';
// Marcas de fecha
public $timestamps = false; 
// Columnas
protected $fillable = ['tec_id', 'tec_nombre', 'tec_activo', 'tec_movil'];
// Pivot
public function solicitudes()
{
return $this->belongsToMany('OPyME2Solicitud', 'solicitud_tecnico')
->withPivot('tecnico_tec_id');
}
public function moviles()
{
return $this->belongsToMany('OPyME2Movil', 'movil_tecnico')
->withPivot('tecnico_tec_id');
}
}

我无法弄清楚错误是什么。

我认为这可能是因为tecnico_tec_id字段是数据透视表的一部分。您是否尝试过在 wherehas 关闭中查询它?

$finalizadas = Solicitud::where('sol_estado', 4)
->when($tecnico, function ($query) use ($tecnico) {
return $query->whereHas('tecnicos', function ($query) use ($tecnico) {
$query->where('tecnico_tec_id', $tecnico);
});
}, function ($query) {
return $query->has('tecnicos');        
})
->when($desde, function ($query) use ($desde, $hasta) {
return $query->whereBetween('sol_fecha_finalizada', [$desde, $hasta]);
})
->when($tipo, function ($query) use ($tipo) {
return $query->where('sol_tipo_solicitud', $tipo);
})
->when($tecnico, function ($query) use ($tecnico) {
return $query->where('tecnico_tec_id', $tecnico);
})
->when($cliente, function ($query) use ($cliente) {
return $query->where('sol_cliente', $cliente);
})
->get();

终于下一个成功了

$finalizadas = Solicitud::whereHas('tecnicos')
->when($tecnico, function ($query) use ($tecnico) {
return Solicitud::whereHas('tecnicos', function ($query) use ($tecnico) {
return $query->where('tecnico_tec_id', $tecnico)->where('sol_estado', 4);
});
})
->when($cliente, function ($query) use ($cliente) {
return $query->where('sol_cliente', $cliente)->where('sol_estado', 4);
})
->when($desde, function ($query) use ($desde, $hasta) {
return $query->whereBetween('sol_fecha_finalizada', [$desde, $hasta])->where('sol_estado', 4);
})
->when($tipo, function ($query) use ($tipo) {
return $query->where('sol_tipo_solicitud', $tipo)->where('sol_estado', 4);
})
->get();

我以这种方式将关系查询嵌套在主查询中,即使使用所有搜索条件,它也可以工作。PD:技术人员(tecnicos(关系必须始终是第一位的,否则查询将排除日期,应用程序和/或客户端的类型。谢谢@IGP

相关内容

  • 没有找到相关文章

最新更新