У меня есть следующая структура:
Бюро -> hasOne-> Адрес-> hasOne-> Город-> hasOne-> Государственное бюро-> hasOne-> Категория
и
Order-> hasOne-> Address-> hasOne-> City-> hasOne-> State Order-> hasOne-> Category
и
Category-> hasMany-> Orders и Category-> hasMany-> Buros
У меня есть полиморфное отношение «один ко многим» между адресами в одной стороне иБюро / Заказы в другую сторону.Существует только один адрес для буро и только один адрес для заказа, поэтому я могу использовать [0], чтобы получить первый первый и единственный элемент в коллекции.
Адрес класса
class Address extends Model
{
...
public function addressable()
{
return $this->morphTo();
}
...
}
Класс Büro
class Buro extends Model
{
....
public function addressable()
{
return $this->morphMany('App\Address', 'addressable');
}
...
}
Класс заказа
class order extends Model
{
....
public function addressable()
{
return $this->morphMany('App\Address', 'addressable');
}
...
}
Сейчас я строю формув веб-интерфейсе с полем SELECT, чтобы выбрать только из бюро, которые работают в том же состоянии, в котором был размещен заказ.
Используя ELOQUENT, я сделал это:
$all_bueros = Buero::where('category_id', $order->category_id)
->where('title', $order->client->addressable[0]->city->state->title) // <- Look at this "title" column name
->pluck('title', 'id')->all();
Проблемаздесь имя столбца "Title" находится не в таблице "Buros" , а в трех таблицах.Точно в: buros.addresses.city.state.title
Я пробовал эти синтаксисы, но никто не работал:
->where('buros.addresses.city.state.title', $order->client->addressable[0]->city->state->title) // as object notation
и
->where('buros->addressable[0]->cities->state->title', $order->client->addressable[0]->city->state->title) // using the relation
Я использовал построитель запросов, но там еще больше запутанности:
$buros = DB::table('buros')
->join('categories', 'categories.id', '=', $order->category_id)
->join('addresses', 'addresses.addressable_id', '=', $order->id, 'AND','addresses', 'addresses.addressable_type', '=', 'buros') //two points to join the table
->join('cities', 'addresses.city_id', '=', 'cities.id')
->join('states', 'cities.states', '=', 'states.id')
->select('buros.title', 'buros.id')
->where('states.title', '=', $order->client->addressable[0]->city->states->title)
->get();
Моя проблема заключается в том, как объединить таблицу в двух точках, поскольку существует полиморфное отношение.Потому что мне нужно присоединиться к таблице адресов в «столбце Buro» (addressable_type) и в столбце Buro-id (addressable_id)
Любая помощь будет оценена