【问题标题】:Relationship with cross reference table与交叉引用表的关系
【发布时间】:2019-04-21 15:27:32
【问题描述】:

我有 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 表与类别链接。但是如何与其他模型一起使用?

【问题讨论】:

    标签: laravel octobercms


    【解决方案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

    【讨论】:

    • 谢谢!你让我走上正轨。我在 10 月的文档中找到了您的变体。有时很难在那里找到必要的信息。
    • 我只能输出链接的书籍类别(作为复选框列表)。但是如何在完整的复选框列表中设置选中这些类别?
    • 要让复选框“选中”取决于您如何将“选中”属性呈现给复选框的 HTML 输入 DOM 您还需要答案吗?看来你有办法在 OctoberCMS 中实现这一点
    【解决方案2】:

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

    1. 创建包含 2 个字段的数据透视表(或交叉引用表):book_idcategory_id 并将两者都设置为主键
    2. 在 Book 模型中创建 relation 字段。名称不需要写下划线。在类别的关系属性集名称列中。
    3. 在 Book 模型文件中写入:

      公开 $belongsToMany = [ 'categories' => ['mark\myplugin\Models\Category', 'table' => 'mark_myplugin_books_categories'] ];

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多