Laravel 5:为Eloquent Model构建动态查询并传递给查看

时间:2016-04-20 21:16:22

标签: laravel laravel-5 eloquent laravel-5.1 laravel-5.2

我刚刚开始学习Laravel 5,所以我希望我的问题不是太愚蠢。我正在努力实现以下目标。我有3张桌子

广告 类别 advert_category

在我的类别表中,我有主要和子类别。所以父类别的parent_id为NULL,否则显示父类的id。当我保存新广告时,我将广告ID和category_id保存在数据透视表advert_category中。一切正常。我现在正在尝试以下方法。我想要显示带有Maincategories和Subcategories的导航。当我点击子类别然后我可以从advert_category表中轻松读出advert_id,因为我只查找1个category_id,但我现在计划能够点击Maincategory,现在显示属于的所有广告此Maincategory中的所有子类别。所以我的方法如下:

 // Look up if passed id is found under parent_id column 
    $cat = Category::where('parent_id', $id)->get();

    // The choosen category is a maincategory, 
    // therefore build dynamic where to look for all the id's 
    if (count($cat) > 0)
    {    
        $query = Category::select();

        foreach($cat as $value)
        {
            $query->orWhere('id', '=', $value->id);
        }

        $advertList = $query->get();     
    }
    else{
        $advertList = Category::findOrFail($id);
    }

    return view ('publicpage.adverts.showall',['advertList' => $advertList->adverts]);

不幸的是,当我进入Maincategory时,我得到以下错误。当我继续使用子类别时,我会看到所显示的广告。

  

未定义属性:Illuminate \ Database \ Eloquent \ Collection :: $ adverts

dd($ advertlist)带来以下结果:

  

点击Maincategory:

     

收藏{#203▼
      #it​​ems:array:2 [▼

     

0 =>类别{#204▶}

     

1 =>类别{#205▶}
  ]}

所以它显示了Collection。

  

点击子类别

     

类别{#201▼

     

#table:“类别”

     

#connection:null

我可以看到显然存在差异,但我不知道,如何解决这个问题或者最好的方法是什么。我希望我能够很好地理解我的任务,并期待任何建议。提前谢谢!

更新

在下面的评论之后,我试了一下:

    // Look up if passed id is found under parent_id column 
    $cat = Category::where('parent_id', $id)->get();

    if (count($cat) > 0)
    {    
        $query = Category::select();

        foreach($cat as $value)
        {
            $query->orWhere('id', '=', $value->id);
        }

        $advertList = $query->get(); 

        return view ('frontend.adverts.showall',['advertList' => $advertList[0]->adverts]); 

    }
    else{

        // 1 Category, 
        $advertList = Category::findOrFail($id);

        return view ('frontend.adverts.showall',['advertList' => $advertList->adverts]);
    }

通过这种方式,我获得了第一个类别的广告,但我如何设法移交所有类别的广告,或者我该如何处理?我似乎似乎无法解决这个问题。或者改变是否在视图中?我在视图中尝试了另一个foreach以及运行adervertList,但是再次没有成功。有什么建议?非常感谢你提前!

1 个答案:

答案 0 :(得分:1)

TL;博士

问题出在这里,你使用$advertList->adverts$advertList可能在某些情况下是集合(你可以认为它是某种数组)。

所以你不能简单地写$array->adverts但你应该做这样的事情$array[0]->adverts,以防你只想获得adverts第一个元素。