【问题标题】:Call to undefined relationship on model laravel using scope使用范围调用模型 laravel 上的未定义关系
【发布时间】:2018-09-13 15:46:06
【问题描述】:

我正在尝试为每个类别获取 5 个帖子,所以我进行了一些搜索,最后在这里 Getting n Posts per category 但是我在使用范围时收到了一个奇怪的调用模型上未定义的关系,但如果我不使用范围,一切正常。这是类别模型

   //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 ?

【问题讨论】:

  • 你的范围的主要目的是什么?
  • Scope 用于获取每个类别的 5 个帖子@ChiragPatel

标签: php laravel laravel-5.5


【解决方案1】:

我根据您希望每个类别 5 个帖子的目的给出这个答案。 所以你有类别模型和帖子模型。

在类别模型中,您与 Post 模型有这样的关系

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

Post 模型中,您与 Category 模型有这样的关系

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

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

除此之外,您可以使用两种方法

1) 在eagar加载

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

注意:只有当您使用 first() 方法仅获取父子的一个结果时,此方法才有效。

每个类别获得 n 个帖子使用这个。

首先,您可以使用

检索所有类别
$categories = Category::all();

然后您可以使用 foreach 循环,并且在所有 $category 中,您必须像这里一样在其中指定新属性 latestposts

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

在这个 foreach 循环之后,您将获得所有类别的最新 5 篇文章。

在您的代码中试试这个并评论您的查询和评论。

【讨论】:

  • 是的,两者都是一样的,在深入研究之前我已经尝试过它们,两者都会在最后一个类别上给出posts
  • 是的,我已经对此进行了测试,但它不起作用。对此真的很抱歉。 Eagar 加载仅适用于一个父模型。所以你可以使用另一个概念。检查我更新的答案。
  • 你有没有试过这个现在只给我5个帖子
  • 是的。我试过了,效果很好。你想要 5 个帖子对吗?
  • 我想要所有相关类别的 5 个帖子,而不仅仅是 5 个帖子。就像如果我有技术、媒体、教育等类别。然后我想要 Tech、Media、Education 的每个类别的 5 个帖子
猜你喜欢
  • 2020-01-28
  • 2020-06-20
  • 2021-03-09
  • 1970-01-01
  • 2018-05-23
  • 2019-11-17
  • 1970-01-01
  • 2020-12-14
  • 2020-01-31
相关资源
最近更新 更多