Многие ко многим
Для построение соотношения многие ко многим между двумя моделями необходимо в массив $model_elements дописать код нового поля. Дополнительные настройки для поля представлены в описании типа данных Многие ко многим many_to_many.
Например мы хотим связать между собой Предустановленные модели Pages и Blocks соотношением многие ко многим, для того чтобы иметь возможность включать и отключать блоки на каждой конкретной странице.
class Pages extends Model
{
protected $name = 'Меню страниц';
protected $model_elements = [
...
['Текстовые блоки', 'many_to_many', 'blocks', ['related_model' => 'Blocks']]
];
}
Запускаем миграцию из консоли или админки.
composer mv:migrations
Теперь в административном интерфейсе модели Pages появится поле для выбора блоков, которые относятся к данной модели. В модели Blocks пока нет такого поля. Если мы хотим, чтобы оно было и во второй модели, то также добавляем код в файл модели. Миграцию при этом запускать уже не нужно.
class Blocks extends Model
{
protected $name = 'Текстовые блоки';
protected $model_elements = [
...
['Страницы меню', 'many_to_many', 'pages', ['related_model' => 'Pages']]
];
}
Если в шаблоне или модели нужно получить записи по соотношению многие ко многим, используется специальный метод asArrays().
//Извлекаем запись, объект класса Record
$page = $mv -> pages -> find(65);
//Либо так
$page = (new Pages) -> find(65);
//Получаем массив блоков
$blocks = $page -> asArrays('blocks');
//Массив с дополнительными условиями (SQL)
$blocks = $page -> asArrays('blocks', ['active' => 1, 'order->asc' => 'name']);
//Выводим на экран для проверки
Debug::pre($blocks);
Когда нужно вывести записи, с учетом соотношения 'многие ко многим', можно воспользоваться специальным параметром из конструктора запросов.
//В модели Blocks добавляем новый метод для получения блоков конкретной страницы
public function getRelatedBlocks($page_id)
{
$rows = $this -> select(['pages->m2m' => $page_id, 'active' => 1));
$html = '';
foreach($rows as $row)
{
$html .= ...
}
return $html;
}
Предыдущий раздел
Деревья