程序有项目和 Uitems 表(可能有很多程序,很多程序可以有相同或不同的项目,而项目可以在不同的程序中)
数据透视表:包含 items_id 和 items_type ,其中 items_id 可以包含' id &#39 ;来自项目或 uitems
所以,如果我要列出程序:: find(1) - > with(' Items',' uItems'),如果items_type === user使用 uitems 否则使用项目我需要这样的东西!
我有程序表:
id user_id name description
1 2 x workouti High intensity
2 1 yn workouti low intensity
3 2 c workouti massive workout
4 2 b oldm abi sfsdf
我有一个数据透视表,如下图所示。
程序表与下面的2个表有关系
如果您查看数据透视表,我有两列名为 items_id 和 items_type ,这两列代表项目和uitems表格SO;
if(items_type === 'user') then pull info from Uitems as well as;
if(items_type === 'core') then pull info from items.
我试过的是;
Route::get('ws/{id?}', function($id)
{
$workouts = array('Monday'=>'', 'Tuesday'=>'', 'Wednesday'=>'', 'Thursday'=>'', 'Friday'=>'', 'Saturday'=>'', 'Sunday'=>'');
$days = Days::all()->lists("name", "id");
foreach($days as $dayKey => $day)
{
foreach($programs = Programs::find($id)->items()->wherePivot('days_id', $dayKey)->orderBy('sorts_id', 'ASC')->get() as $prokey => $program)
{
$program->settings = Settings::find($program->pivot->settings_id)->toArray();
if($program->pivot->items_type ==='core')
{
$program->items = Items::find($program->pivot->items_id)->toArray();
}else if ($program->pivot->items_type ==='user')
{
$program->items = Uitems::find($program->pivot->items_id)->toArray();
$program->by =User::find(Uitems::find($program->pivot->items_id)->user_id)->toArray();
}
$workouts[$day][] = $program->toArray();
}
}
$program = json_encode($workouts);
return $program;
});
但是这段代码导致了对mysql的39个查询尝试,这根本不是很酷。 这给我提供了我想要的弱表现:
在哪里说:oguzhan Piskin有来自Uitems的信息,而其他来自Items
我需要使用Eloquent的Eager加载来实现这一目标。此外,还查找了查询构建器,但我的优先级是使用Eloquent进行预先加载。 任何帮助或线索高度赞美!
程序模型:
class Programs extends Eloquent
{ protected $ table =" program&#34 ;;
public function items()
{
return $this->belongsToMany('Items')->withPivot('settings_id', 'days_id', 'sorts_id', 'id', 'items_type', 'items_id');
}
因为我使用程序访问数据我只使用项目来访问数据但是当uitems数据加入数据透视表中的挑战时我不能同时使用这两种数据。
答案 0 :(得分:3)
尝试以下方法: 阅读更多here about eager loading constrains
编辑模型:
public function items()
{
return $this->belongsToMany('Items')->wherePivot('items_type', 'core')->withPivot('settings_id', 'days_id', 'sorts_id', 'id', 'items_type', 'items_id')
}
public function uitems()
{
return $this->belongsToMany('Items')->wherePivot('items_type', 'users')->withPivot('settings_id', 'days_id', 'sorts_id', 'id', 'items_type', 'items_id')
}
在你的控制器中:
<?php
Route::get('ws/{id?}', function($id)
{
$workouts = array('Monday'=>'', 'Tuesday'=>'', 'Wednesday'=>'', 'Thursday'=>'', 'Friday'=>'', 'Saturday'=>'', 'Sunday'=>'');
$days = Days::all()->lists("name", "id");
$program = Programs::find($id)->with('items','items');
?>
希望我理解你想要的东西。请让我知道