【问题标题】:Retrieving collection from linked eloquent models laravel从链接的雄辩模型 laravel 中检索集合
【发布时间】:2017-06-07 22:06:12
【问题描述】:

我正在使用 laravel 5.3,在 Eloquent 模型查询方面需要一些帮助。我有三个模型(UserDetails、Categories、Articles)。我在 UserDetails->Categories (belongstoMany) 和 Categories->Articles (belongstoMany) 之间有关系,它们运作良好。但是,我将如何获取 Userdetails->Categories->Articles 之间的关系数据。

每个单独的关系都运行良好,即 Userdetails::find(1)->categories 和 Categories::find(1)->Articles。

我觉得范围可能是答案,但当我尝试时它们似乎不起作用。

模型中的关系

UserDetails.php

 public function Categories(){
    return $this->belongstoMany('App\Categories', 'users_cats',  'user_id','cat_id');
}

Categories.php

  public function articles(){
    return $this->belongsToMany('App\Article', 'article_categories', 'categoryID', 'articleID');
}

我研究了 HasManyThrough 函数,但我再次遇到了实现它的问题,据我所知应该是

  return $this->hasManyThrough('App\Article', 'App\Categories', TertiaryForeignKey, FinalForeignKey, LocalForeignKey);

我的表设置为

articles_categories 数据透视表

articleID - 文章的主键

categoryID – 类别的主键

users_cats 数据透视表

user_id - userdetails 的主键

cat_id - 类别的主键

基于此,hasManyThrough 应该如下所示?

 public function articles(){
    return $this->hasManyThrough('App\Article', 'App\Categories', 'user_id', 'articleID', 'id');
}

但是这会返回错误 未找到列:1054“字段列表”中的未知列“categories.user_id”

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    更新

    所以如果你想拥有这种关系

    用户详细信息->类别->文章

    那么你需要这样做:

    用户详情模型:

    public function categories()
    {
        return $this->hasMany(Category::class);
    }
    
    public function articles()
    {
        return $this->hasManyThrough(Article::class, Categories::class);
    }
    

    类别型号:

    public function userdetails()
    {
        return $this->belongsTo(Userdetails::class);
    }
    
    public function categories()
    {
        return $this->hasMany(Category::class);
    }
    

    文章型号:

    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }
    

    那你可以直接拨打UserDetails::find(1)->articles->get();

    【讨论】:

    • 我正在为我的关系数据使用自定义的结构,并返回错误 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'categories.user_details_id' in 'field list' (SQL:选择journalarticle.*, categories.user_details_id from journalarticle 内部连接categories on categories.id = journalarticle.categories_id 其中categories.@1)我需要将密钥传递给 HasManyThrough 函数吗?我已将我的表结构添加到原始帖子中
    • 在创建外键时,您应该始终按照约定命名列,即categorie_id、article_id、user_id....然后在创建关系时不需要指定这些键,只需命名类即可。它更简单,应该这样做!
    • 我修复了表格,但它仍然返回该错误。运行 hasThrough many 和两个多对多关系是否存在问题?
    • 哦,是的……你还需要建立其他关系……我会更新我的答案
    • 我建议将模型名称从 Category 更改为 Tag,因为 laravel 通过在模型名称末尾添加“s”来自动命名表格......
    【解决方案2】:

    你只需要在 UserDetails.php 模型:

    public function categories()
    {
        return $this->hasMany(Categories::class);
    }
    

    在 Categories.php 模型中:

     public function articles()
    {
        return $this->hasMany(Articles::class);
    }
    

    然后您可以检索控制器中的类别集合:

    $userdetails = UserDetails::get();
    

    将 $categories 变量传递到您的视图中,并使用 foreach 循环显示每条记录(其中文章是模型中的函数)

       @foreach($userdetails->categories as $usercategories )
            <div> {{$usercategories->name}} </div>
    
            @foreach($usercategories->articles as $categoryarticles )
              <div> {{$categoryarticles->name}} </div>
            @endforeach
       @endforeach
    

    使用第二个 foreach,您将访问属于该用户的类别的文章。

    【讨论】:

    • 是的,我可以获取与类别相关联的文章,根据原始问题,我想获取与用户拥有的类别相关联的所有文章,因此 UserDetails->Categories->Articles,而不是类别->文章。
    • 我已经编辑了我的答案,希望对你有帮助@user5067291
    猜你喜欢
    • 2015-08-15
    • 2017-10-04
    • 2015-03-04
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多