Внешние ключи
Если в модели используется поле типа enum, то списком его значений могут быть данные из другой модели. Такая взаимосвязь строится на основе внешних ключей.
Пример связи между новостями и комментариями, каждый комментарий относится к конкретной новости и связан с ней внешним ключом.
class News extends Model
{
protected $name = 'Новости';
protected $model_elements = [
['Активировать', 'bool', 'active', ['on_create' => true]],
['Название', 'char', 'name', ['required' => true]],
['Дата', 'date_time', 'date', ['required' => true]],
['Содержание', 'text', 'content', ['rich_text' => 'true']],
['Комментарии', 'many_to_one', 'comments', ['related_model' => 'Comments']]
];
}
class Comments extends Model
{
protected $name = 'Комментарии к новостям';
protected $model_elements = [
['Активировать', 'bool', 'active', ['on_create' => true]],
['Дата', 'date_time', 'date', ['required' => true]],
['Имя', 'char', 'name', ['required' => true]],
['Новость', 'enum', 'news_id', ['foreign_key' => 'News']],
['Содержание', 'text', 'content']
];
}
У модели Новости присутствует поле Комментарии типа Многие к одному, чтобы можно было видеть количество комментариев к каждой новости, а также быстро перейти к модели комментариев с отфильтрованными записями, относящимися к данной новости.
Отображение записей по внешнему ключу
Предположим, все новости отображаются по URL /news, а отдельная новость по URL вида /news/25.
//Файл config/routes.php
'/news' => 'view-news-all.php',
'/news/*' => 'view-news-detailed.php',
<?
//Файл views/view-news-detailed.php
$url_part = $mv -> checkUrlPart(2, 'numeric');
$news_record = $mv -> news -> find(['active' => 1, 'id' => $url_part]);
$mv -> display404($news_record);
$mv -> seo -> mergeParams($news_record -> name.' '.I18n::formatDate($news_record -> date));
$total = echo $mv -> comments -> countRecords(['active' => 1, 'news_id' => $news_record -> id]);
include $mv -> views_path.'main-header.php';
?>
<div id='content'>
<div class='date'><? echo I18n::formatDate($news_record -> date); ?></div>
<h1><? echo $news_record -> name; ?></h1>
<? echo $news_record -> content; ?>
<div id='comments'>
<h3>Комментарии: <? echo $total; ?></h3>
<? echo $mv -> comments -> display($news_record -> id); ?>
</div>
</div>
<? include $mv -> views_path.'main-footer.php'; ?>
Добавляем функцию отображения комментариев для модели Comments.
<?
class Comments extends Model
{
...
public function display(int $news_id): string
{
$html = '';
$rows = $this -> select(['active' => 1, 'news_id' => $news_id, 'order->desc' => 'date']);
foreach($rows as $row)
{
$html .= '<div class="date">'.$row['name'].' '.I18n::formatDate($row['date']).'</div>';
$html .= '<p>'.$row['content'].'</p>';
}
return $html;
}
}
Предыдущий раздел
Простые модели