【问题标题】:How to query Eloquent relational tables based on json ids如何根据 json id 查询 Eloquent 关系表
【发布时间】:2021-03-29 23:24:01
【问题描述】:

我有一个 articles 表,其中包含一个名为 article_categories 的字段。 我有一个带有id 字段的categories 表。

在我的Article Model我已经定义:

public function category(){
    return $this->hasMany(Category::class,'id','article_categories');
}

articles 表中的类别保存为 json,如["1","3","24"]

在我的ArticleController 中,我想检索特定article 的所有categories。 在我的edit function 中的ArticleController 我有这个功能:

public function edit(Article $article)
{
    $category_ids = implode(',',json_decode($article->article_categories)) ; //this gives me 1,3,24

    /////////
   // HERE SHOULD COME THE QUERY WHICH I DON'T KNOW
   // $article_categories = ?????????? 
    ////////
    
    $categories = Category::all();

    return view('article.edit', compact('articles','categories','article_categories'));
}

根据我的研究,Laravel 无法做到这一点,但我不知道这是否属实。我正在使用 Laravel 8。 谁能帮帮我?

【问题讨论】:

    标签: php mysql laravel eloquent eloquent-relationship


    【解决方案1】:

    首先,您应该知道您在单个列中违反了many-to-many 关系,这是无效的。您应该做的是一个数据透视表article_categorycategory_article,在ArticleCategory 模型中,您将定义many-to-many 关系

    像这样

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

    在你的控制器中你可以做

    public function edit(Article $article)
    {
        $categories = Category::all();
    
        return view('article.edit', compact('article','categories'));
    }
    

    在视图中您将可以直接访问$article->categories


    在你目前的情况下,你可以这样做

    public function edit(Article $article)
    {
        $category_ids = json_decode($article->article_categories)
    
        $article_categories = Category::whereIn('id', $category_ids);
    
        $categories = Category::all();
    
        return view('article.edit', compact('article','categories','article_categories'));
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2021-06-10
      • 2013-10-03
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多