Связь с таблицей перекрестных ссылок

#laravel #octobercms

#laravel #octobercms

Вопрос:

У меня есть 3 таблицы: books , categories и book_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' => 'markmypluginModelsCategory'
];
  

BookCategory потому что книга связана с категорией через book_category таблицу. Но как быть с другими моделями?

Ответ №1:

В отношении многие ко многим BookCategory рассматривается как слабый объект

Вам не нужно будет создавать модель для этого

Попробуйте это

 namespace App;

use IlluminateDatabaseEloquentModel;

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

use IlluminateDatabaseEloquentModel;

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

Более подробную информацию смотрите: Отношения «Многие ко многим»

Комментарии:

1. Спасибо! Вы наставили меня на правильный путь. Я нашел ваш вариант в октябрьских документах. Иногда бывает трудно найти там необходимую информацию.

2. Я мог выводить только связанные категории книг (в виде списка флажков). Но как установить отмеченные эти категории в полном списке флажков?

3. Получение флажков «проверено» зависит от того, как вы отображаете атрибут «проверено» в DOM ввода HTML флажка Вам все еще нужен ответ? кажется, у вас есть способ реализовать это в OctoberCMS

Ответ №2:

Я сделал неправильно. Вот решение. Я использовал Builder.

  1. Создайте сводную таблицу (или таблицу перекрестных ссылок) с 2 полями: book_id , category_id и установите оба в качестве первичного ключа.
  2. В модели книги создайте поле связи. Не нужно писать подчеркивание для имени. В свойстве отношения задайте столбец имени категории.
  3. В файле модели книги напишите:

    public $belongsToMany = [ ‘categories’ => [‘markmypluginModelsCategory’, ‘table’ => ‘mark_myplugin_books_categories’] ];

Вот и все! Теперь категории, которые вы проверили, будут сохранены в сводной таблице, и они будут проверены на страницах предварительного просмотра, обновления.