2013-08-03 2 views
0

Вот один из ваших гуру. У меня есть 4 стола. Пользователи, шеф-повара, места, типы.Продвинутый пользовательский запрос с пользовательской сводной таблицей

пользователи таблица

id 
etc 

Повара стол стол

id 
user_id 
etc 

места

id 
zip 
etc 

типов таблица

id 
type_name 
etc 

Каждого Chef счет создана является пользователем. Каждая созданная учетная запись пользователя не обязательно является шеф-поваром. Существуют и другие типы, но я опускаю для простоты.

Chef и пользовательские модели

class Chef extends Eloquent { 
    public function user() { 
     return $this->belongsTo('User'); 
    } 
} 
class User extends Eloquent { 
    public function chef() { 
     return $this->hasOne('Chef'); 
    } 
} 

таблица «пользователей» имеет отношения многие ко многим с таблицей "локаций. Я также включил «type_id» в сводную таблицу «location_user».

location_user поворотный стол

id 
location_id 
user_id 
type_id 

Расположение Модель

class Location extends Eloquent { 
    public function users() { 
     return $this->belongsToMany('User')->withTimestamps()->withPivot(['type_id']); 
    } 
} 

Моя цель состоит в том, чтобы вернуть все Chef идентификаторы для определенного 'молнии', поле, которое находится в «местах ' Таблица. Немного больше информации - одно из значений type_id, доступных в сводной таблице, равно «0». Это представляет собой местоположение по умолчанию, если Пользователь, который стал шеф-поваром, не хочет создавать отдельное местоположение для своей учетной записи шеф-повара. У каждого пользователя есть одна из них, соответствующая запись pivot (location_user) с типом_id = 0. Если пользователь желает получить отдельное местоположение в качестве шеф-повара, создается отдельная запись таблицы «местоположение» и связана отдельной отдельной записью таблицы с типом_имя = 2. Таким образом, система знает, какое место использовать. Если для конкретного Пользователя существует учетная запись шеф-повара, но не сопровождаемая сводной учетной записью с типом_ид = 2, тогда вместо этого используется местоположение, в котором используется сводная учетная запись (с этими user_id и type_id = 0).

Это часть моего поиска кода:

 if ($city_search || $zip_search) { 
      $chef_ids = array(); 
      // TODO: Possibly bad for scaling. Find a single Eloquent call for this 
      $locations = Location::with('users') 
       ->where('zip', 'LIKE', "%$city_search%") 
       ->where('zip', 'LIKE', "%$zip_search%") 
       ->get(); 
      foreach ($locations as $loc) { 
       foreach ($loc->users as $user) { 
        $chef_ids[] = $user->chef->id; 
       } 
      } 
     } 

     if (count($chef_ids) == 0) return NULL; 

Проблема заключается в том, что, если один пользователь также повар с его шеф-повара Место, как по умолчанию, но есть и другой [тип, отличный от шеф-повара] Местоположение , тогда в сводной таблице будет 2 записи для этого пользователя, один с типом_id = 0 (обслуживающим как по умолчанию, так и местами шеф-повара), а другой - с типом_id =?. Если по умолчанию Location не соответствует запрошенному «zip» значению, а другому, то возвращается идентификатор шеф-повара. Для наглядности поток будет таким: получить все местоположения с zip =?. Получите всех пользователей из сводной таблицы.

* Один из пользователей также является шеф-поваром, поскольку его учетная запись для шеф-повара использует местоположение по умолчанию (запись в сводной таблице с типом_ид = 0. Нет записи с его значением user_id и type_id = 2). *

Получите шеф-поваров, а затем их идентификаторов от всех этих Пользователей. У этого пользователя есть сводная учетная запись с идентификатором location_id, содержащим запрошенное значение zip? Да (для другого типа). У этого пользователя есть учетная запись для шеф-повара? Да. Затем его chef_id возвращается, хотя его учетная запись Chef использует местоположение по умолчанию в другом почтовом индексе.

Любое предложение?

ответ

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