【问题标题】:Laravel 4.1 Eloquent Relations with belongstoMany or morphToMany god know whatLaravel 4.1 Eloquent Relations with belongstoMany 或 morphToMany 天知道
【发布时间】:2014-04-20 09:26:00
【问题描述】:

Programs 有 ItemsUitems 表(可以有许多程序,许多程序可以有相同或不同的项目,而项目可以在不同的程序中)

数据透视表:有 items_iditems_type,其中 items_id 可以有来自任一 的“id”物品物品

所以如果我要列出 Programs::find(1)->with('Items', 'uItems') where if items_type ===user use uitems else use items 我需要这样的东西!

我有程序表:

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

我有一个如下图所示的数据透视表。

Programs 表与下面的 2 个表有关系

  1. 项目“核心”--> id |类别 ID |姓名 |说明
  2. Uitems“用户”--> id |用户 ID |姓名 |说明

如果您查看数据透视表,我有两个名为 items_iditems_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;

});

但是这段代码导致了 39 次对 mysql 的查询尝试,这一点都不酷。 这正是我想要的表现不佳:

在哪里说:oguzhan Piskin 有来自 Uitems 的信息,而其他来自 Items 的信息

我需要使用 Eloquent 的 Eager 加载来完成此操作。还可以找到查询构建器,但我的首要任务是使用 Eloquent 进行急切加载。 任何帮助或线索都非常感谢!

程序模型:

class Programs extends Eloquent

{ 受保护的 $table = "程序";

public function items()
{
    return $this->belongsToMany('Items')->withPivot('settings_id', 'days_id', 'sorts_id', 'id', 'items_type', 'items_id');
}

因为我使用程序来获取数据,所以我只使用项目来获取数据,但是当 uitems 数据加入数据透视表中的挑战时,我不能同时使用两者。

【问题讨论】:

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


    【解决方案1】:

    尝试类似: 阅读更多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');
    ?>
    

    希望我能正确理解您想要什么。请告诉我

    【讨论】:

    • 错误:“语法错误,意外'使用'(T_STRING),期待'{'”$itemsConstrain = function($query)使用($dayKey){$query->wherePivot('days_id' , $dayKey) $query->wherePivot('items_type', 'core'); $query->orderBy('sorts_id', 'ASC'); };
    • 我尝试了“使用”以及尝试调试它。这次它说语法错误,意外'$query'(T_VARIABLE)
    • 在哪一行?还。您只有 1 个具有该 $id 的产品。没有?
    • 哦等等! Days 模型仅给出 id:1 name: monday 等,因此其中没有其他数据。我用那些日子只对数据透视表中的主要数据进行分类,然后我使用 Programs::find(1)->items()->get() 之类的东西来列出所有项目及其枢轴,但只有项目而不是 uitems
    • 因为您对 Items 和 UItems 使用相同的 items_id,所以这样做有点困难,但并非不可能:)
    猜你喜欢
    • 2021-09-23
    • 2019-10-20
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多