Вернуть принадлежащее имя с идентификатором формы Laravel, проверить тип? - PullRequest
0 голосов
/ 12 января 2019

извините за заголовок этого вопроса, но я не знаю, как его задать ...

Я работаю над проектом, в котором у меня есть две модели Поезда и Автомобили, к этой модели у меня есть принадлежащий Маршрут.

Я хочу сделать запрос и проверить, равен ли routeable_type App\Car, чем при выбранном routeable_id, чтобы получить данные из автомобиля. И если routeable_type - поезд, то с идентификатором, чтобы получить данные из Тран.

Итак, мои модели выглядят так:

Поезд:

class Train extends Model
{
  public function routes()
  {
      return $this->morphMany('App\Route', 'routeable');
  }

}

Автомобиль:

class Car extends Model
{
  public function routes()
  {
      return $this->morphMany('App\Route', 'routeable');
  }

}

Маршрут:

class Route extends Model
{
  public function routeable()
  {
      return $this->morphTo();
  }
}

И запрос, который у меня есть на данный момент:

$data = Route::leftjoin('cars', 'cars.id', '=', 'routes.routeable_id')
    ->leftjoin('trains', 'trains.id', '=', 'routes.routeable_id')
    ->select('routes.id', 'cars.model AS carmodel', 'trains.model AS trainmodel', 'routeable_type', 'routes.created_at');

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

Будет ли что-то подобное возможно в одном запросе:

$data = Route::select('routes.id', 'routeable_type', 'routes.created_at');

if(routeable_type == 'Car'){
  $data = $data->leftjoin('cars', 'cars.id', '=', 'routes.routeable_id')->select('routes.id', 'cars.model AS carmodel', 'routeable_type', 'routes.created_at');
}else{
  $data = $data->leftjoin('trains', 'trains.id', '=', 'routes.routeable_id')->select('routes.id', 'trains.model AS trainmodel', 'routeable_type', 'routes.created_at');
}

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Мне не хватает репо, поэтому я не могу комментировать. вот почему я ставлю в качестве ответа.

Вы должны использовать 2 разных запроса для каждой модели.

Это будет лучше, как с точки зрения кода, так и с точки зрения производительности. Также, если обе модели имеют одинаковые поля, вы должны объединить их в 1 таблицу и добавить столбец типа. и поместите не похожие поля в столбец «мета». (по моему мнению)

0 голосов
/ 12 января 2019

Может быть, это то, что вы ищете?

DB::table('routes')
    ->leftJoin('cars', function ($join) {
        $join->on('cars.id', '=', 'routes.routeable_id')
            ->where('routes.routeable_type', 'App\Car');
    })
    ->leftJoin('trains', function ($join) {
        $join->on('trains.id', '=', 'routes.routeable_id')
            ->where('routes.routeable_type', 'App\Train');
    })
    ->select('routes.id', 'cars.model AS car_model', 'trains.model AS train_model', 'routes.routeable_type', 'routes.created_at');
    ->get();
0 голосов
/ 12 января 2019

Я думаю, что вы можете следовать дизайну morphedByMany.

https://laravel.com/docs/5.7/eloquent-relationships#many-to-many-polymorphic-relations

Это был также аккуратный визуал для разных типов отношений.

https://hackernoon.com/eloquent-relationships-cheat-sheet-5155498c209

Я столкнулся с подобной проблемой, хотя изначально не смог следовать правильному плану и был вынужден запросить множество возможных отношений, затем написал собственную логику, после чего собирал типы отношений и идентификаторы, затем выполнял другой запрос и назначал их обратно через итерацию. , Это было некрасиво, но сработало ... очень похоже на то, как Eloquent работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...