我在使用来自多个表单输入的值的查询时遇到问题,每个表单输入都是可选的。
这个想法是找到分配给技术人员的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_tecnico
在tecnicos
.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