#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.
- Создайте сводную таблицу (или таблицу перекрестных ссылок) с 2 полями:
book_id
,category_id
и установите оба в качестве первичного ключа. - В модели книги создайте поле связи. Не нужно писать подчеркивание для имени. В свойстве отношения задайте столбец имени категории.
-
В файле модели книги напишите:
public $belongsToMany = [ ‘categories’ => [‘markmypluginModelsCategory’, ‘table’ => ‘mark_myplugin_books_categories’] ];
Вот и все! Теперь категории, которые вы проверили, будут сохранены в сводной таблице, и они будут проверены на страницах предварительного просмотра, обновления.