Можно ли сделать where необязательными?


я получаю данные из 4 inputs, которые могут быть необязательными каждый. По формуле неповторенной перестановки будет 24 возможных случая.

Чтобы не делать 24 if, есть ли способ сделать where необязательными?

PS: чтобы избежать этого:

if(isset($asesor_input) && empty($cliente_input) && isset($grupo_input)){
        $eventos = $pedido->whereIn('EV_cliente',$cliente_grupo)->whereIn('EV_asesor',$asesor_input);
    }
    if(isset($asesor_input) && isset($cliente_input) && empty($grupo_input)){
        $eventos = $pedido->whereIn('EV_asesor',$asesor_input)->whereIn('EV_cliente',$cliente_input);
    }
    if(empty($asesor_input) && empty($cliente_input) && empty($grupo_input)){
        $eventos = $pedido->whereIn('EV_asesor',$asesores)->whereIn('EV_cliente',$clientes);
    }
    if(empty($asesor_input) && isset($cliente_input) && empty($grupo_input)){
        $eventos = $pedido->whereIn('EV_asesor',$asesores)->whereIn('EV_cliente',$cliente_input);
    }
    if(isset($asesor_input) && empty($cliente_input) && empty($grupo_input)){
        $eventos = $pedido->whereIn('EV_asesor',$asesor_input)->whereIn('EV_cliente',$clientes);
    }
    if(empty($asesor_input) && empty($cliente_input) && isset($grupo_input)){
        $eventos = $pedido->whereIn('EV_asesor',$asesores)->whereIn('EV_cliente',$cliente_grupo);
    }
Author: Shaz, 2019-05-21

2 answers

После попытки понять, что вы ищете, я искал шаблон для минимизации этих сложных if и пришел к выводу, что это может быть сделано таким образом с условными выражениями, будучи гораздо более читаемым:

// Suponiendo que la consulta es al modelo Pedido, 
// voy a asumir una consulta cualquiera como base

$query = Pedido::select('id', 'name');

if (isset($asesor_input)) {

    $query->whereIn('EV_asesor', $asesor_input);

} else {

    $query->whereIn('EV_asesor', $asesores);

}

if (isset($cliente_input)) {

    $query->whereIn('EV_cliente', $cliente_input);

} elseif (isset($grupo_input) {

    $query->whereIn('EV_cliente', $cliente_grupo);

} else {

    $query->whereIn('EV_cliente',$clientes);

}

// finalmente hacemos la consulta
$eventos = $query->get();

Я бы поверил, что можно еще больше улучшить/упростить этот код, но для этого потребуется больше контекста, однако это хорошее начало, гораздо более понятное.

 2
Author: Shaz, 2019-05-22 00:41:14

Посмотрите, можете ли вы решить это с этим, что я сделал, это синтезировать то, что вы делали в каждом блоке внутри массива, и с простым foreach делать эти операции, проблема в том, что ваши 27 условных выражений будут продолжать существовать, что теперь в виде array:

$datos = [
    [
        'condicion' => isset($asesor_input) && empty($cliente_input) && isset($grupo_input),
        'dato1'     => 'EV_cliente',
        'valor1'    => $cliente_grupo,
        'dato2'     => 'EV_asesor',
        'valor2'    => $asesor_input
    ],
    [
        'condicion' => isset($asesor_input) && isset($cliente_input) && empty($grupo_input),
        'dato1'     => 'EV_asesor',
        'valor1'    => $asesor_input,
        'dato2'     => 'EV_cliente',
        'valor2'    => $cliente_input
    ],
    [
        'condicion' => empty($asesor_input) && empty($cliente_input) && empty($grupo_input),
        'dato1'     => 'EV_asesor',
        'valor1'    => $asesores,
        'dato2'     => 'EV_cliente',
        'valor2'    => $clientes
    ],
    [
        'condicion' => empty($asesor_input) && isset($cliente_input) && empty($grupo_input),
        'dato1'     => 'EV_asesor',
        'valor1'    => $asesores,
        'dato2'     => 'EV_cliente',
        'valor2'    => $cliente_input
    ],
    [
        'condicion' => isset($asesor_input) && empty($cliente_input) && empty($grupo_input),
        'dato1'     => 'EV_asesor',
        'valor1'    => $asesor_input,
        'dato2'     => 'EV_cliente',
        'valor2'    => $clientes
    ],
    [
        'condicion' => empty($asesor_input) && empty($cliente_input) && isset($grupo_input),
        'dato1'     => 'EV_asesor',
        'valor1'    => $asesores,
        'dato2'     => 'EV_cliente',
        'valor2'    => $cliente_grupo
    ],
];

foreach($datos as $dato) {
    if($dato['condicion']) {
        $eventos = $pedido->whereIn($dato1, $valor1)->whereIn($dato2, $valor2);
    }
}

В любом случае взгляните на предложение when

 0
Author: Dariel Ramos Díaz de Villegas, 2019-05-22 00:42:49