Приклад ORM відношення

Приклад відношення has_many в парі із відношенням belongs_to.

Припустимо в нас є модель повідомлень із назвою Post, яка має відношення до моделі User. Оскільки кожне повідомлення обов'язково має свого єдиного автора, то, з точки зору моделі Post, вона відноситься до моделі User belongs_to. З точки зору ж моделі User, вона відноситься до моделі Post has_many, оскільки користувач може мати більше одного повідомлення.

На практиці перевірено що зазначення $_primary_key у моделях є регістрозалежним! Тобто якщо у вас в базі даних $_primary_key = 'ID', а ви у моделях пропишете $_primary_key= 'id', Кохана не видасть винятків, але і не буде працювати коректно

Створимо відповідні моделі.

APPPATH/classes/model/post.php
<?php defined('SYSPATH') or die('No direct access allowed.');
 
class Model_Post extends ORM {
	protected $_db_group = 'forum'; // Назва групи конфігурації бази даних
	protected $_table_name = 'posts'; // Назва таблиці
	protected $_primary_key = 'pid'; // Назва первинного ключа в таблиці posts
	protected $_belongs_to = array(
		'author' => array(	// Аліас author для таблиці users
			'model'       => 'user', // Назва пов'язаної моделі
			'foreign_key' => 'uid', // Зовнішній ключ в моделі posts
		),
	);
}
APPPATH/classes/model/user.php
<?php defined('SYSPATH') or die('No direct access allowed.');
 
class Model_User extends ORM {
	protected $_db_group = 'forum'; // Назва групи конфігурації бази даних
	protected $_table_name = 'users'; // Назва таблиці
	protected $_primary_key = 'uid'; // Назва первинного ключа в таблиці users
	protected $_has_many = array(
		'posts' => array(	// Аліас posts для таблиці posts
			'model'       => 'post', // Назва пов'язаної моделі
			'foreign_key' => 'uid', // Зовнішній ключ в моделі posts
		),
	);
}
Припустимо, що в нас конфігураційний файл для бази даних, до якого ми будемо звертатись із моделей по назві групи конфігурації (в даному випадку forum), такий:
APPPATH/config/database.php
<?php defined('SYSPATH') or die('No direct access allowed.');

return array
(
	'forum' => array
	(
		'type'       => 'mysql',
		'connection' => array(
			'hostname'   => 'localhost',
			'database'   => 'database_name',
			'username'   => 'Username',
			'password'   => 'password',
			'persistent' => TRUE,
		),
		'table_prefix' => '',
		'charset'      => 'utf8',
		'caching'      => FALSE,
		'profiling'    => TRUE,
	),
);
В наступному коді дані розпечатуються прямо з контролера лише для прикладу. На практиці дані потрібно передавати в представлення (View).
Припустимо що нам потрібно викликати ці моделі із контролера Forum:
APPPATH/classes/controller/forum.php
<?php defined('SYSPATH') or die('No direct access allowed.');
 
class Controller_Forum extends Controller {
 
	public function action_index()
	{
        // Створюємо об'єкт моделі Post із primary key = 5
        $posts = ORM::factory('post', 5);

        // Зі сторони моделі Post звертаємось до аліасу author (для таблиці user)
        // і витягуємо значення з існуючого поля login
        echo $posts->author->login.':<br>';

        // Зі сторони моделі Post витягуємо значення з існуючого поля post_c в таблиці posts
        echo $posts->post_c.'<hr>';
		
		// Створюємо об'єкт моделі User із primary key = 1
		$user = ORM::factory('user', 1);
		
		// Зі сторони моделі User витягуємо значення з існуючого поля login в таблиці users
		echo $user->login.':<br>';
		
		// Зі сторони моделі User звертаємось до аліасу posts (для таблиці posts)
        // і витягуємо всі значення з існуючого поля post_c
		foreach($user->posts->find_all() as $posts_all)
		{
			echo $posts_all->post_c.'<br>';
		}
	}
}
Якщо ви знайшли помилку, прохання - виділіть текст помилки (максимум 127 символів) і натисніть Ctrl+Enter.