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