Laravel 4.1 Eloquent与belongsstoMany或morphToMany上帝的关系知道什么

时间:2014-04-20 09:26:01

标签: php laravel-4 eloquent eager-loading relation

程序有项目 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

我有一个数据透视表,如下图所示。 The structure of my pivot table

程序表与下面的2个表有关系

  1. items" core" - > id | category_id |名字|描述
  2. Uitems"用户" - > id | user_id |名字|描述
  3. 如果您查看数据透视表,我有两列名为 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个查询尝试,这根本不是很酷。 这给我提供了我想要的弱表现:

    enter image description here

    在哪里说: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数据加入数据透视表中的挑战时我不能同时使用这两种数据。

1 个答案:

答案 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');
?>

希望我理解你想要的东西。请让我知道