Я создаю приложение Kohaha для управления линиями sip в звездочке.
Я хочу использовать ORM, но мне интересно, как связать определенные таблицы, которые уже установлены.
например, таблица sip_lines выглядит следующим образом.
+--------------------+------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+------------------+------+-----+-------------------+-----------------------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | sip_name | varchar(80) | NO | UNI | NULL | | | displayname | varchar(48) | NO | | NULL | | | line_num | varchar(10) | NO | MUL | NULL | | | model | varchar(12) | NO | MUL | NULL | | | mac | varchar(16) | NO | MUL | NULL | | | areacode | varchar(6) | NO | MUL | NULL | | | per_line_astpp_acc | tinyint(1) | NO | | 0 | | | play_warning | tinyint(1) | NO | | 0 | | | callout_disabled | tinyint(1) | NO | | 0 | | | notes | varchar(80) | NO | | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +--------------------+------------------+------+-----+-------------------+-----------------------------+
sip_buddies:
+----------------+------------------------------+------+-----+-----------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------------------+------+-----+-----------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(80) | NO | UNI | | | | host | varchar(31) | NO | | | | | | | lastms | int(11) | NO | | 0 *** snip *** +----------------+------------------------------+------+-----+-----------+----------------+
Эти две таблицы фактически связаны как sip_lines.sip_name = sip_buddies.name
Как я могу связать их в ORH Kohana, так как это было бы неправильно?
<?php defined('SYSPATH') or die('No direct script access.'); /* A model for all the account information */ class Sip_Line_Model extends ORM { protected $has_one = array("sip_buddies"); } ?>
EDIT: На самом деле, было бы справедливо сказать, что эти таблицы не связаны с внешними ключами! DOH.
EDIT: Похоже, что Kohana ORM не настолько гибкая. ORM, вероятно, не способ пойти и лучше всего работает для совершенно новых проектов, где модель данных может быть изменена. Причина в том, что имена ключей должны соответствовать определенному соглашению об именах, иначе они не будут связаны в Кохане.
Это не кохана ORM, а до вашего дизайна db. Всегда было «правило» использовать целое как внешний ключ, а не varchar, я не видел такой дизайн целую вечность.
Добавьте целочисленные FK или вообще не думайте об использовании ORM, просто так не работает.
РЕДАКТИРОВАТЬ:
И да, если вы действительно хотите сделать это таким образом;
protected $has_one = array('buddy' => array('model' => 'sip_buddy', 'foreign_key' => 'name' ) );
Это правильно, только если вы планируете использовать отношения «один-к-одному». Однако, если вы планируете иметь отношения «один ко многим», вы захотите использовать $ has_many. В зависимости от ваших потребностей вы можете дополнительно создать модель для другой таблицы и использовать $ belongs_to для нее.
Здесь все объясняется: http://docs.kohanaphp.com/libraries/orm/starting