Вот один из ваших гуру. У меня есть 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 использует местоположение по умолчанию в другом почтовом индексе.
Любое предложение?