代码之家  ›  专栏  ›  技术社区  ›  Saad Suri

使用scope调用模型laravel上的未定义关系

  •  4
  • Saad Suri  · 技术社区  · 8 年前

    我试图为每个类别获得5篇帖子,所以我做了一点搜索,最后来到这里 Getting n Posts per category 但在使用scope时,我收到了一个对模型上未定义关系的奇怪调用,但如果我不使用scope,一切都很好。这是 类别模型

       //Relationship with posts
        public function posts(){
            return $this->hasMany('App\Post');
        }
    

    scopeNPerGroup范围

    public function scopeNPerGroup($query, $group, $n = 10)
        {
            // queried table
            $table = ($this->getTable());
    
            // initialize MySQL variables inline
            $query->from( \DB::raw("(SELECT @rank:=0, @group:=0) as vars, {$table}") );
    
            // if no columns already selected, let's select *
            if ( ! $query->getQuery()->columns) 
            { 
                $query->select("{$table}.*"); 
            }
    
            // make sure column aliases are unique
            $groupAlias = 'group_'.md5(time());
            $rankAlias  = 'rank_'.md5(time());
    
            // apply mysql variables
            $query->addSelect(\DB::raw(
                "@rank := IF(@group = {$group}, @rank+1, 1) as {$rankAlias}, @group := {$group} as {$groupAlias}"
            ));
    
            // make sure first order clause is the group order
            $query->getQuery()->orders = (array) $query->getQuery()->orders;
            array_unshift($query->getQuery()->orders, ['column' => $group, 'direction' => 'asc']);
    
            // prepare subquery
            $subQuery = $query->toSql();
    
            // prepare new main base Query\Builder
            $newBase = $this->newQuery()
                ->from(\DB::raw("({$subQuery}) as {$table}"))
                ->mergeBindings($query->getQuery())
                ->where($rankAlias, '<=', $n)
                ->getQuery();
    
            // replace underlying builder to get rid of previous clauses
            $query->setQuery($newBase);
        }
    

    使用关系调用Npergroup

    public function latestposts()
        {
            return $this->posts()->latest()->nPerGroup('category_id', 5);
        }
    

    后模型关系

    //Post belongs to Category
     public function category(){
            return $this->belongsTo('App\Category');
        }
    

    在我的 类别控制器 我在打电话 latestposts 通过

    $categories = Category::with('latestposts')->get();
    

    但我得到了一个错误: Call to undefined relationship on model

    我想要的是: 获取每个类别的N个帖子,但我现在完全不知所措了。任何帮助都将不胜感激

    参考号: Tweaking Eloquent relations – how to get N related models per parent ?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Saad Suri    8 年前

    我给这个答案是基于你的目的,你想每个类别5个职位。 所以你有分类模型和发布模型。

    在类别模型中,您与 邮递 像这样的模型

        //Relationship with posts
        public function posts(){
            return $this->hasMany('App\Post');
        }
    

    并且在 邮递 与您有关系的型号 类别 像这样的模型

    //Post belongs to Category
     public function category(){
            return $this->belongsTo('App\Category');
        }
    

    我向您展示您已经完成SQL查询的问题。

    相反,您可以使用两种方法

    1) 给出条件,同时 伊格尔 正在加载

    $categories = Category::with(['posts' => function ($query) {
        $query->orderBy('created_at', 'desc')->take(5);
    }])->get();
    

    注意:只有当您使用 first() 方法

    获取 n每个类别的帖子数量使用此选项。

    首先,您可以使用

    $categories = Category::all();
    

    然后可以使用foreach循环和 $类别 您必须在其中指定新属性,如下所示 最新立柱 ,则,

    foreach ($categories as $category)
    {
        $category->latestposts = $category->posts()->orderBy('created_at','desc')->take(5)->get();
    }
    

    在此foreach循环之后,您将获得所有类别中的最新5篇帖子。

    在您的代码中尝试这一点,并注释您的查询和评论。

    推荐文章