объединить таблицу в два столбца из-за полиморфного отношения - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующая структура:

Бюро -> 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)

Любая помощь будет оценена

...