2016-09-06 1 views
1

У меня есть таблица, называют «имение», и четыре сводных таблиц для некоторых характеристик, как список удобств, intallations и т.д.Добавить столбец в виде MySQL из сводной таблицы (работа с Laravel 5)

Когда Я хочу сделать поиск (у объектов есть около 200 полей и пять мультиселектов). Я использую представление, называемое «westates», чтобы ускорить поиск. Но когда мне нужно искать другие характеристики, я использую четыре foreach (PHP), и я пересекаю все результаты и сравниваю их с сводной таблицей: - $ модели - результат первого запроса.

$extras = $request->ms_extras_amenities; //Items selected in multiselect 
    $others = $request->ms_more_features; 
    $facilities = $request->ms_other_installations; 
    $lapse = $request->lapse; 

    $models = $models->filter(function($model) use ($lapse,$extras,$others,$facilities) 
    { 
     $haslapse = false; 
     if(count($lapse)){ 
      foreach($lapse as $item){ 
       $result = \DB::table('rent_period_estates') 
        ->whereRaw("estates_id = $model->id AND rent_period_id = $item") 
        ->count(); 
       if($result != 0) $haslapse = true; 
      } 
     } 
     else 
      $haslapse = true; 

     $hasextras = true; 
     if(count($extras)){ 
      foreach($extras as $extra){ 
       $result = \DB::table('extras_amenities_estates') 
        ->whereRaw("estates_id = $model->id AND extras_id = $extra") 
        ->count(); 
       if($result == 0) $hasextras = false; 
      } 
     } 

     $hasothers = true; 
     if(count($others)) { 
      foreach ($others as $other) { 
       $result = \DB::table('other_chara_estates') 
        ->whereRaw("estates_id = $model->id AND other_chara_id = $other") 
        ->count(); 
       if ($result == 0) $hasothers = false; 
      } 
     } 
     $hasfacilities = true; 
     if(count($facilities)) { 
      foreach ($facilities as $facility) { 
       $result = \DB::table('other_facilities_estates') 
        ->whereRaw("estates_id = $model->id AND other_facilities_id = $facility") 
        ->count(); 
       if ($result == 0) $hasfacilities = false; 
      } 
     } 
    //Estate have to have all items selected in the multiselectd fields 
     if ($hasothers && $hasextras && $hasfacilities && $haslapse){ 
      return $model; 
     } 
    }); 

Теперь у меня есть правильные результаты, но тестирование с 7 состояниями я бы сделал около 300 запросов.

Я хочу знать, как я могу создать представление, в том числе для того, чтобы запятые разделили запятыми как текст (это идея), например, получить результаты в массиве, привести его в порядок ([2,1,8,4 ] до «1,2,4,8») в поле, на мой взгляд, поэтому, когда я делаю запрос, я могу сделать только один запрос: ... И (westates.others = $ model-> others AND westates .extras = $ model-> extras AND ...)

Может быть, процедура может быть выполнена на сервере MySQL, но на самом деле я не могу найти решение.

Вот вид:

"CREATE OR REPLACE VIEW westates AS 
      SELECT 
       concat(estates.locale,estates.id) as code, 
       cities.name as city, 
       councils.name as council, 
       states.name as state, 
       countries.name as country, 
       concat(cities.name,' (',councils.name,')') as city_council, 
       estates.* 

      FROM estates 
       JOIN countries ON (estates.country_id = countries.id) 
       JOIN states  ON (estates.state_id = states.id) 
       JOIN councils ON (estates.city_council_id = councils.id) 
       JOIN cities  ON (estates.city_id = cities.id)" 

ответ

0

Благодаря Рик Джеймс (который отвечает на другую должность). Для кого-то с той же проблемой (мало опыта работы с SQL) я хочу опубликовать ответ. Представьте себе, что у нас есть столы, главный стол Estates и сводная таблица с некоторыми дополнениями, названными estates_extras.

table estates 
columns id, address 

table estates_extras 
columns estate_id, extra_id 

Мы хотим, чтобы вид, что есть:

table westates 
columns estates.id, estates.address, extras 
like 
    id  address   extras 
    25000 My nice road 1,5,8 

Прежде всего: Если мы не включаем DISTINCT мы будем иметь на наш взгляд, такое же количество столбцов повторными, так как элементы имеют в статистов в этом примере (с тремя статистов):

results 
    id  address   extras 
    25000 My nice road 1,5,8 
    25000 My nice road 1,5,8 
    25000 My nice road 1,5,8 

И если мы не добавляем JOIN, как LEFT JOIN мы не имеем никаких сословий, которые не имеют почти один дополнительный. Таким образом, с этим запросом у нас будут все наши Усадьбы, и если у них есть дополнения, их список будет разделен запятыми.

CREATE OR REPLACE VIEW westates AS 
    SELECT DISTINCT 
     estates.id, 
     estates.address, 
     (SELECT GROUP_CONCAT(estates_extras.extras_id) FROM estates_extras 
     WHERE estates_extras.estate_id = estates.id) AS extras 
    FROM estates 
    LEFT JOIN estates_extras ON (estates_extras.estates_id = estates.id)