Круглые скобки предложения Where в модели Laravel

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Когда я повторяю свой запрос, используя dd($query->toSql()); , я получаю:

 "select `item_num`, `item_name`, `primary_color`, `content` 
    where (`item_name` NOT LIKE ? and `item_name` NOT LIKE ? and `item_name` NOT LIKE ? ) 
and `primary_color` = ? or `primary_color` = ? or `primary_color` = ? 
order by `item_name` asc ◀"
  

Что мне нужно, так это параграфы вокруг ( primary_color = ? or primary_color = ? or primary_color = ?) , чтобы запрос выглядел как:

 "select `item_num`, `item_name`, `primary_color`, `content` 
    where (`item_name` NOT LIKE ? and `item_name` NOT LIKE ? and `item_name` NOT LIKE ? ) 
and (`primary_color` = ? or `primary_color` = ? or `primary_color` = ? )
order by `item_name` asc ◀"
  

Вот мой код:

 $query = DB::table('my_table');
$query = $query->select(array('item_num', 'item_name', 'color', 'content'));
    
$query = $query->where($this->filterArr);

$cc = count($myArr);
$ii = 0;

foreach ($myArr as $key => $value) {
    $myArr = explode(" ", $value);
    if($ii==0)
      $query = $query->where( function(){ $column, '=', $myArr[0]);
    else
      $query = $query->orWhere($column, '=', $myArr[0]);

      if(count($myArr)>1){
        foreach($myArr as $filter){

          if ($key=='collection'){
            $filter = str_replace("-", " ", $filter);
          }

          $query = $query->orWhere($column, '=', $filter);
        }
      }
    }

  $ii  ;
}

$query = $query->orderBy('item_name', 'asc')
              ->simplePaginate(50); 
  

из этого я получаю ошибку syntax error, unexpected ',' из этой строки $query = $query->where( function(){ $column, '=', $myArr[0]);

Может ли кто-нибудь помочь добавить круглые скобки вокруг оператора WHERE, пожалуйста. Спасибо.

редактировать $myArr — это набор фильтров

   Array (
    [color] => blue
    [color] => purple
    [material] => slick granite
  )
  

Комментарии:

1. Ваш код довольно запутанный, и для того, чтобы мы могли решить вашу проблему, вам нужно включить $myArr и то, как он определяется. Должно быть лучшее решение, чем это tbh.

2. @mrhn добавил пример myArr, да, есть много условий, но я не смог обойти все требования.

Ответ №1:

попробуйте это, кстати, ваш цикл выглядит таким беспорядочным XD

если это то, чего вы хотите достичь скриншот предполагается :

 $myArr = Array (
  "color" => "blue"
  "color" => "purple"
  "material" => "slick granite",
  "collection" => "slick-granite-blue-purple"
);
  

и если массив имеет ключевое имя «коллекция», то замените значение массива («-«) на (» «)

 $query = DB::table('your_table');
$query = $query->select(array('item_num', 'item_name', 'color', 'content'));
        
$query = $query->where(function($query){
  $query = $query->where('item_name', '!=', 'item1');
  $query = $query->where('item_name', '!=', 'item2');
  $query = $query->where('item_name', '!=', 'item3');
});//im using !=, replace with your need

$query = $query->where(function($filter) use($myArr){
  $ii=0;
  foreach ($myArr as $key => $value) {
    if($ii==0){
      if($key == 'collection')
        $value = str_replace('-', ' ', $value);
      $filter = $filter->where($key, '=', $value);
    }else{
      if($key == 'collection')
        $value = str_replace('-', ' ', $value);
      $filter = $filter->orWhere($key, '=', $value);
    }
    $ii  ;
  };
});
  

Комментарии:

1. но как насчет финала $query = $query->orderBy('item_name', 'asc')->simplePaginate(50); , где это вписывается?

2. да, это так, и теперь я лучше понимаю, как писать запросы.