2016-10-29 3 views
1

Вот мой запрос:Использует два вложенных предложения WHERE?

$first = DB::table('news') 
     ->selectRaw('"news" as tableName, id, title, description, imgPath') 
     ->where(function($query) use ($q) { 
      $query->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 
     }); 

    $results = DB::table('productions') 
     ->selectRaw('"productions" as tableName, id, title, description, imgPath') 
     ->where(function($query) use ($q) { 
      $query->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 
     }) 
     ->unionAll($first) 
     ->get(); 

Как вы видите, есть where(), а также есть в нем whereRaw() .. это правильно?

Результат в порядке, я имею в виду, что это точно так, как ожидалось. Просто я беспокоюсь о производительности. вы знаете, я могу это сделать только одним where(). Однако в настоящее время он работает, но я пугаю, если набор данных будет огромным, тогда, возможно, он будет медленным.

В любом случае, мой код хороший?

+0

Я не знаю, почему вы используете закрытие только для одного условия. Но это не имеет значения с точки зрения производительности sql, потому что он построит один и тот же SQL-запрос. –

ответ

0

Нет необходимости добавлять ни одного места в where() закрытие. Вы можете написать код без этого также как:

$first = DB::table('news') 
    ->selectRaw('"news" as tableName, id, title, description, imgPath') 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 

$results = DB::table('productions') 
    ->selectRaw('"productions" as tableName, id, title, description, imgPath') 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 
    ->unionAll($first) 
    ->get(); 

Но если вы на самом деле забота о производительности, когда набор данных становится огромным, то я советую вам использовать paginate() функцию вместо get()

0

Нет ничего, что я бы сказал, особенно неправильно с точки зрения функциональности, но есть кое-что, что вы могли бы очистить, например. вы делаете selectRaw только для того, чтобы вы могли использовать псевдоним таблицы, но вы никогда не используете псевдоним.

$first = DB::table('news') 
    ->select(['id', 'title', 'description', 'imgPath']) 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)"); 

$results = DB::table('productions') 
    ->select(['id', 'title', 'description', 'imgPath']) 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)") 
    ->unionAll($first) 
    ->get(); 

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

+0

Это не псевдоним таблицы, это столбец, содержащий имя таблицы. –

+0

А ты прав, извини. В этом случае выражение select может быть '-> select (['id', 'title', 'description', 'imgPath', 'news'])' одинаково для производства, но отключить 'news' для 'productions' , Я не совсем уверен в вашей реализации, но это, скорее всего, легче читать с атрибутом, называемым «новостями» или «производством», чем «tableName». Однако, если вы настроены на то, что он назвал «tableName» уверенным, что снова функциональность мудрая, это не должно быть проблемой. –

+0

Извините, это не сработает. БД попытается выбрать столбец 'news' из таблицы' news' и столбца 'productions' из таблицы' productions'. Но эти столбцы, вероятно, не существуют. То, что хочет OP, - это столбец 'tableName' с жестко закодированными значениями 'news' и 'productions' в зависимости от того, из какой таблицы из строки. –

Смежные вопросы