与对照表的关系

时间:2019-04-21 15:27:33

标签: laravel octobercms

我有3个表:bookscategoriesbook_category

book_category是交叉引用表。它具有以下结构: book_id, category_id

我需要在书籍模型的“创建”页面上输出类别(作为复选框)。 如果我这样做的话,它会起作用:

// Book Model
public function getCategoriesOptions($value, $formData)
{
    $categories = Category::all();
    $list = array();
    foreach ($categories as $category) {
        $list[$category->id] = $category->name;
    }
    return $list;
}

但是在“预览”,“更新”页面中未选中创建时检查的类别。在book_category表中,所有选中的类别均已保存。我认为问题出在关系上。

我为book_category表创建了模型。结果,有3种模型: Book, Category, BookCategory。如何实现它们之间的关系?

很显然,Book可以有许多类别,因此在Book模型中,我写道:

public $hasMany = [
    'categories' => 'mark\myplugin\Models\Category'
];

BookCategory,因为书籍通过book_category表与类别链接。但是如何与其他模型搭配?

2 个答案:

答案 0 :(得分:1)

在多对多关系中,BookCategory被认为是一个弱实体

您无需为此创建模型

尝试一下

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    public function categories()
    {
        return $this->belongsToMany('App\Category', 'book_category', 'book_id', 'category_id');
    }
}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    public function books()
    {
        return $this->belongsToMany('App\Book', 'book_category', 'category_id', 'book_id');
    }
}

更多详细信息,请参见:Many To Many Relationships

答案 1 :(得分:0)

我做错了。这是解决方案。我使用了Builder。

  1. 创建具有两个字段的数据透视表(或交叉引用表): m12=pd.merge(df1, df2, on=['Circle','Division'], how='inner',suffixes=('1',' 2')) m13=pd.merge(df1, df3, on=['Circle','Division'], how='inner',suffixes=('1',' 3')) m14=pd.merge(df1, df4, on=['Circle','Division'], how='inner',suffixes=('1',' 4')) m23=pd.merge(df2, df3, on=['Circle','Division'], how='inner',suffixes=('2',' 3')) m24=pd.merge(df2, df4, on=['Circle','Division'], how='inner',suffixes=('2',' 4')) m34=pd.merge(df3, df4, on=['Circle','Division'], how='inner',suffixes=('3',' 4')) book_id,并将两者均设置为主键
  2. 在“图书”模型中创建“ 关系”字段。名称不需要写下划线。在类别的关系属性集名称列中。
  3. 在Book模型文件中写入:

    public $ belongsToMany = [         '类别'=> ['mark \ myplugin \ Models \ Category','table'=>'mark_myplugin_books_categories']    ];

就是这样!现在,您检查的类别将保存到数据透视表中,并且将在“预览”,“更新”页面中进行检查。