Laravel donde en O donde en

4 minutos de lectura

Estoy haciendo una búsqueda de productos por filtros:

Mi código:

->where(function($query) use($filter)
{
  if(!empty($filter)){
    foreach ($filter as $key => $value) {           
      $f = explode(",", $value);        
      $query-> whereIn('products.value', $f);
    }           
  }
})

Consulta:

and (products.value in (Bomann, PHILIPS) and products.value in (red,white)) 

Pero yo necesito:

and (products.value in (Bomann, PHILIPS) OR products.value in (red,white)) 

¿Hay algo similar en Laravel:

orWhereIn

  • si y se llama exactamente como orWhereIn. amigo, deberías haberlo intentado primero.

    – itachi

    31 de marzo de 2014 a las 10:13

Podrías haber buscado solo whereIn funcionar en el núcleo para ver eso. Aquí estás. Esto debe responder a todas sus preguntas.

/**
 * Add a "where in" clause to the query.
 *
 * @param  string  $column
 * @param  mixed   $values
 * @param  string  $boolean
 * @param  bool    $not
 * @return \Illuminate\Database\Query\Builder|static
 */
public function whereIn($column, $values, $boolean = 'and', $not = false)
{
    $type = $not ? 'NotIn' : 'In';

    // If the value of the where in clause is actually a Closure, we will assume that
    // the developer is using a full sub-select for this "in" statement, and will
    // execute those Closures, then we can re-construct the entire sub-selects.
    if ($values instanceof Closure)
    {
        return $this->whereInSub($column, $values, $boolean, $not);
    }

    $this->wheres[] = compact('type', 'column', 'values', 'boolean');

    $this->bindings = array_merge($this->bindings, $values);

    return $this;
}

Mira que tiene un tercer parámetro booleano. Buena suerte.

Usted tiene un orWhereIn función en Laravel. Toma los mismos parámetros que el whereIn función.

No está en la documentación, pero puede encontrarlo en la API de laravel.
http://laravel.com/api/4.1/

Eso debería darte esto:

$query-> orWhereIn('products.value', $f);

$query = DB::table('dms_stakeholder_permissions');
$query->select(DB::raw('group_concat(dms_stakeholder_permissions.fid) as fid'),'dms_stakeholder_permissions.rights');
$query->where('dms_stakeholder_permissions.stakeholder_id','4');
$query->orWhere(function($subquery)  use ($stakeholderId){
            $subquery->where('dms_stakeholder_permissions.stakeholder_id',$stakeholderId);
            $subquery->whereIn('dms_stakeholder_permissions.rights',array('1','2','3'));
    });

 $result = $query->get();

return $result;

// SALIDA @input $stakeholderId = 1

//seleccione group_concat(dms_stakeholder_permissions.fid) como fid, dms_stakeholder_permissionss.rights de dms_stakeholder_permissions dónde dms_stakeholder_permissions.stakeholder_id = 4 o (dms_stakeholder_permissions.stakeholder_id = 1 y dms_stakeholder_permissions.rights en (1, 2, 3))

Sí, orWhereIn es un método que puede utilizar.

Estoy bastante seguro de que debería darle el resultado que está buscando, sin embargo, si no es así, simplemente puede usar implode para crear una cadena y luego explotarla (esto es una suposición de la estructura de su matriz):

$values = implode(',', array_map(function($value)
{
    return trim($value, ',');
}, $filters));

$query->whereIn('products.value', explode(',' $values));

avatar de usuario
Nishith Shah

Sí, orWhereIn donde existe el método de la cláusula en Laravel. Consulte el siguiente enlace de la documentación oficial de Laravel Query Builder para obtener información detallada.

Enlace de documentación: https://laravel.com/docs/8.x/queries#additional-where-clauses

Hay dos formas de obtener el siguiente resultado.

and (products.value in (Bomann, PHILIPS) OR products.value in (red,white))
  1. Usando orWhereIn
$query = Product::where('color', 'blue')
    ->whereIn('value', ['Bomann', 'PHILIPS'])
    ->orWhereIn('value', ['red', 'white'])
    ->get();

Producción:

select * from `products` where `color` = 'blue' and `value` in (Bomann, PHILIPS) OR `value` in (red,white)) 
  1. Usando orWhere y whereIn
$query2 = Product::where('color', 'blue')
    ->whereIn('value', ['Bomann', 'PHILIPS'])
    ->orWhere(function ($query) {
        $query->whereIn('value', ['Bomann', 'PHILIPS']);
    })
    ->get();

Producción:

select * from `products` where `color` = 'blue' and `value` in (Bomann, PHILIPS) OR (`value` in (red,white)) 

avatar de usuario
Angustia

Por ejemplo, si tiene múltiples condiciones whereIn OR whereIn y quiere poner corchetes, hágalo así:

$getrecord = DiamondMaster::where('is_delete','0')->where('user_id',Auth::user()->id);
if(!empty($request->stone_id))
{
    $postdata = $request->stone_id;
    $certi_id =trim($postdata,",");
    $getrecord = $getrecord->whereIn('id',explode(",", $certi_id))
                           ->orWhereIn('Certi_NO',explode(",", $certi_id));     
}
$getrecord = $getrecord->get();

¿Ha sido útil esta solución?