对不起,这个问题的标题,但是我不确定如何问...
我正在一个项目中,我有两个火车和汽车模型,为此模型我有一条所属的路线。
我要查询并检查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');
}
答案 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个表中并添加“类型”列。 并将非相似字段放在“元”列中。 (我认为)