以ID形式Laravel返回所属名称,检查类型?

时间:2019-01-12 09:41:40

标签: php laravel eloquent

对不起,这个问题的标题,但是我不确定如何问...

我正在一个项目中,我有两个火车和汽车模型,为此模型我有一条所属的路线。

我要查询并检查routeable_type是否是App\Car,而不是所选routeable_id,以便从汽车中获取数据。如果routeable_type是Train,则使用ID从Tran获取数据。

所以我的模型是这样的:

火车:

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');

使用此查询,如果我在汽车和火车上具有相同的ID,则会从这两个数据中获取数据,并且会弄乱所有数据。我如何检查routeable_type是否为Car ...,如果routeable_type为Train ..这样做吗?

在1个单一查询中可能会发生以下情况:

$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 :(得分:1)

也许这就是您想要的?

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();

答案 1 :(得分:0)

我认为您可能希望遵循morphedByMany设计。

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

对于不同的关系类型,这也是一种简洁的视觉效果。

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

尽管最初我没有遵循正确的设计,但我被迫查询许多可能的关系,然后在收集关系类型和id之后编写自定义逻辑,然后再进行一次查询并通过迭代将它们分配回来,我遇到了类似的问题。这很丑陋,但能起作用……与Eloquent的正常工作方式非常相似。

答案 2 :(得分:0)

我没有足够的仓库,所以我无法发表评论。这就是为什么我要回答。

对于每个模型,您应该使用2个不同的查询。

这将是更好的选择,无论是代码方面还是性能方面。同样,如果两个模型都具有相似的字段,则应将它们合并到1个表中并添加“类型”列。 并将非相似字段放在“元”列中。 (我认为)