Laravel - Как я могу заказать запрос по полю в загруженном полиморфном отношении c? - PullRequest
0 голосов
/ 01 марта 2020

У меня есть полиморфная c настройка отношений между пользователями и подрядчиками:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('first_name');
    $table->string('last_name');
    $table->morphs('user');
});

Schema::create('contractors', function (Blueprint $table) {
    $table->bigIncrements('id');
    //... etc
});

Приложение \ Пользователь

public function userable()
{
    return $this->morphTo();
}

Приложение \ Подрядчик

public function user()
{
    return $this->morphOne('App\User', 'userable');
}

Цель состоит в том, чтобы иметь разные типы пользователей, поскольку у подрядчика могут быть другие данные полей, которые нам нужно собрать, но они всегда будут иметь все поля в таблице пользователей.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я получаю все подрядчики и загружаю данные пользователя, как я могу сделать заказ по столбцу last_name в таблице пользователей?

class ContractorController extends Controller
{
    public function all(Request $request)
    {
        return Contractor::with('user')->paginate(15); // order by users.last_name here
    }
}

Я прочитал, что я Придется объединить таблицы, но по какой-то причине в ответе возвращается NULL для пользовательского объекта.

class ContractorController extends Controller
{
    public function all(Request $request)
    {
        return Contractor::with('user')
            ->join('users', 'contractors.id', '=', 'users.userable_id')
            ->paginate(15);
    }
}

1 Ответ

1 голос
/ 01 марта 2020

Поскольку lastname является столбцом таблицы пользователей. вы не можете использовать with('user') и заказывать по lastname.

Однако вы можете использовать join('users',...) вместо with(user):

Contractor::join('users', 'contractors.id', '=', 'users.userable_id')
          ->orderBy('users.lastname')
          ->paginate(15);

И поскольку есть дубликаты id(contractors.id, users.id) когда вы используете join, если вы все еще хотите получить объект user в качестве атрибута, вы можете сделать это следующим образом:

Contractor::join('users', 'contractors.id', '=', 'users.userable_id')
          ->orderBy('users.lastname')
          ->selectRaw('contractors.*, users.lastname')
          ->with('user')
          ->paginate(15);
...