【问题标题】:Laravel how to manage many to many relationship for FAQsLaravel 如何管理多对多关系的常见问题解答
【发布时间】:2020-02-26 21:36:55
【问题描述】:

我正在使用 laravel 5.6 多对多关系在数据库中添加常见问题解答。这是我的迁移:

常见问题类别:(所有常见问题类型的列表)

Schema::create('faq_categories', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->softDeletes();
                $table->timestamps();
            });

常见问题解答表:

 Schema::create('faqs', function (Blueprint $table) {
                $table->increments('id');
                $table->string('title', 160);
                $table->longText('description');
                $table->boolean('published')->default(0);
                $table->softDeletes();
                $table->timestamps();
            });

常见问题类型:(特定常见问题的所有常见问题类别)

Schema::create('faq_types', function (Blueprint $table) {
               $table->increments('id');
                $table->integer('faq_id')->unsigned();
                $table->foreign('faq_id')->references('id')->on('faqs')->onDelete('cascade');
                $table->integer('faq_category_id')->unsigned();
                $table->foreign('faq_category_id')->references('id')->on('faq_categories')->onDelete('cascade');
                $table->timestamps();
            });

我已经定义了这样的关系:

应用\常见问题类别

class FaqCategory extends Model {

    use SoftDeletes;

    public function faqs() {
        return $this->belongsToMany('App\Faq');
    }
}

应用\常见问题解答

class Faq extends Model {

    use SoftDeletes;

    public function categories() {
        return $this->belongsToMany('App\FaqCategory');
    }

}

我想要按类别列出的所有常见问题解答。假设faq_categories 表中有GeneralOther 类别,那么我想要按GeneralOther 分组的常见问题解答。

但我无法检索按类别分组的所有常见问题解答。我做了以下但面临错误:

$faq = FaqCategory::find(1);
        return $faq->faqs;
        dd($faq);

错误:

SQLSTATE[42S02]:未找到基表或视图:1146 表 'db_name.faq_faq_category' 不存在。

谁能建议我如何处理这种情况或处理这种情况的最佳方法?

【问题讨论】:

  • 您在模型中声明表名的位置,例如 protected $table = tbl_ads';
  • 不,我没有在模型中定义

标签: php laravel laravel-5


【解决方案1】:

我认为你需要将你的关系定义为

public function faqs() {
    return $this->belongsToMany('App\Faq', 'faq_types');
}

public function categories() {
        return $this->belongsToMany('App\FaqCategory', 'faq_types');
    }

因为你没有遵守约定。

Laravel 默认查找表 'faq_faq_category'(按字母顺序排列的单一模型名称)。

您可以阅读更多关于定义多对多关系in the documentation

【讨论】:

  • 假设如果我将表 faq_type 修改为 faq_faq_category 那么这会解决我的问题吗?
  • 是的,您可以修改表名以匹配约定,或者告诉 Laravel 在关系定义中使用您的表 'faq_types',如上所示
  • 但是我该如何存储关系数据,我已经将表名修改为faq_faq_category而不是faq_types
  • 要存储数据,您可以使用附加方法,即$faq = Faq::find(1); $faq->categories()->attach([1,2]); 上面的代码将 id=1 的 faq 与类别 1 和 2 连接起来,因此它在 faq_types 表中创建了 2 行。 Attach 方法接受单个以及 id 数组
  • 如何获得按类别分组的常见问题解答
猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 2014-11-11
  • 2015-09-14
  • 2019-05-06
  • 2014-05-24
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多