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

Mysql Laravel 5.7-when()函数中的高级where()查询,mysql,laravel,eloquent,relation,wherehas,Mysql,Laravel,Eloquent,Relation,Wherehas,我在使用来自多个表单输入的值的查询中遇到问题,每个表单输入都是可选的 其想法是找到分配给技术人员的ISP应用程序(即技术服务、安装等) 由于输入是可选的,所以我使用->when()函数来避免使用NULL值进行查询 但我还需要使用技术人员的ID查找应用程序,该ID与相关应用程序ID一起存储在数据透视表中 这是控制器中的代码 $finalizadas=requestud::whereHas('tecnicos') ->when($desde,函数($query)use($desde,$hasta){

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

其想法是找到分配给技术人员的ISP应用程序(即技术服务、安装等)

由于输入是可选的,所以我使用
->when()
函数来避免使用
NULL
值进行查询

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

这是控制器中的代码

$finalizadas=requestud::whereHas('tecnicos')
->when($desde,函数($query)use($desde,$hasta){
返回$query->whereBetween('sol_fecha_finalizada',[$desde,$hasta])->where('sol_estado',4);
})
->当($tipo,函数($query)使用($tipo){
返回$query->where('sol_tipo_requestud',$tipo)->where('sol_estado',4);
})
->when($tecnico,函数($query)use($tecnico){
返回$query->where('tecnico_tec_id',$tecnico)->where('sol_estado',4);
})
->当($cliente,函数($query)使用($cliente){
返回$query->where('sol_cliente',$cliente)->where('sol_estado',4);
})->get();
返回视图('cousudes.listar_finalizadas')->带有('finalizadas',$finalizadas);
sol_estado=4表示应用程序已完成

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

问题是,当我试图通过技术人员搜索应用程序时,会出现下一个错误

SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“tecu id”(SQL: 从
请求中选择*
存在的位置(从tecnicos
内部连接
requestud\u tecnico
tecnicos
tec\u id
=
Clarcud\u tecnico
tecnico\u id
其中
征求意见书
征求意见书id=
征求意见书tecnico
征求意见书id
) 和
tec_id
=8和
sol_estado
=4)

这句话,虽然应该在关系中,但不起作用

->when($tecnico,function($query)use($tecnico){
返回$query->where('tecnico_tec_id',$tecnico)->where('sol_estado',4);
})
但这个很有魅力

$finalizadas=requestud::whereHas('tecnicos',函数($query)use($tecnico){
$query->where('tecnico_tec_id',$tecnico)->where('sol_estado',4);
})->get();
模型请求(应用)


我认为这可能是因为
tecnico_tec_id
字段是透视表的一部分。你试过在whereHas闭包中查询它吗

$finalizadas=requestud::where('sol_estado',4)
->when($tecnico,函数($query)use($tecnico){
返回$query->whereHas('tecnicos',函数($query)use($tecnico){
$query->where('tecnico_tec_id',$tecnico);
});
},函数($query){
返回$query->has('tecnicos');
})
->when($desde,函数($query)use($desde,$hasta){
返回$query->whereBetween('sol_fecha_finalizada',[$desde,$hasta]);
})
->当($tipo,函数($query)使用($tipo){
返回$query->where('sol\u tipo\u requestud',$tipo);
})
->when($tecnico,函数($query)use($tecnico){
返回$query->where('tecnico_tec_id',$tecnico);
})
->当($cliente,函数($query)使用($cliente){
返回$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

您不能将关系查询约束在关系之外,因此您需要将约束嵌套为您所使用的代码。我尝试将工作代码(关系)嵌套在给出错误的代码中(当)。。当我搜索一项技术时,它可以正常工作,但是如果我搜索一项技术+从/到日期或任何其他搜索条件,它会返回一个emtpy查询。你能添加模型及其各自的属性吗?@IGP done,models postedIt返回
调用未定义的方法OPyME2\requestud::tecnico()
On
返回$query->->has('tecnico')
tecnicos
,错误地键入了关系方法相同的错误:
列未找到tecnico\u tecu id
关系查询
和tecnico\u tec\u id=8
,它位于主查询的外部,这就是它找不到列的原因,idk如何放置在其中:(
<?php

namespace OPyME2;

use Illuminate\Database\Eloquent\Model;

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('\OPyME2\Solicitud', 'solicitud_tecnico')
        ->withPivot('tecnico_tec_id');
    }

    public function moviles()
    {
        return $this->belongsToMany('\OPyME2\Movil', 'movil_tecnico')
        ->withPivot('tecnico_tec_id');
    }
}

$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();