Larvel 5.7 - Расширенный запрос where () внутри функции when () - PullRequest
0 голосов
/ 17 октября 2019

У меня проблемы с запросом, который использует значения из нескольких входов формы, и каждый из них является необязательным.

Идея состоит в том, чтобы найти приложения ISP (т. Е. Технические службы, установки и т. Д.)назначен технику.

Поскольку входные данные являются необязательными, я использую функцию ->when(), чтобы избежать запросов со значениями NULL.

Но также мне нужно найти приложенияиспользуя идентификатор технического специалиста, этот идентификатор сохраняется в сводной таблице с идентификатором соответствующего приложения.

Это код в контроллере

$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 - это идентификатор техника в сводной таблице solicitud_tecnico

Проблема заключается в том, что при попытке поиска приложений по технику возникает следующая ошибка.

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'tec_id' в 'предложении where' (SQL: SELECT * FROM solicitudes ГДЕ СУЩЕСТВУЕТ (SELECT * FROM tecnicos INNER JOIN * 1025)* ON 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();

Модель Solicitud (Приложение)

<?php

namespace OPyME2;

use Illuminate\Database\Eloquent\Model;

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

Модель Tecnico (Техник)

<?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');
    }
}

Я не могу понять, в чем ошибка.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Наконец, следующий сделал свое дело

$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: technicians (tecnicos) должны быть всегда первыми, в противном случае запрос исключает даты, тип приложения и / или клиента. Спасибо @ IGP

0 голосов
/ 17 октября 2019

Я думаю, это может быть вызвано тем, что поле tecnico_tec_id является частью сводной таблицы. Вы пытались запросить его внутри, где есть закрытие?

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