Как связать таблицы с разными именами внешних ключей в Kohana ORM? - PullRequest
1 голос
/ 29 января 2010

Я создаю приложение 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

Как мне связать их в Kohana ORM, так как это было бы не совсем правильно?

<?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");
}

?>

РЕДАКТИРОВАТЬ: На самом деле, было бы справедливо сказать, что эти таблицы не связаны должным образом с внешними ключами! DOH.

РЕДАКТИРОВАТЬ: Похоже, что Kohana ORM не так гибок. ORM, вероятно, не тот путь, который лучше всего подходит для совершенно новых проектов, в которых модель данных может быть изменена. Причина в том, что имена ключей должны соответствовать определенному соглашению об именах, иначе они не будут связаны в Кохане.

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Это не до Кохана ORM, но до вашего дизайна БД.Это всегда было «правилом» использовать целое число в качестве внешнего ключа, а не varchar, я не видел такой дизайн целую вечность.

Добавляйте целочисленные FK или вообще не думайте об использовании ORM, простоне работает таким образом.

РЕДАКТИРОВАТЬ:

И да, если вы действительно хотите сделать это таким образом;

protected $has_one = array('buddy' => array('model' => 'sip_buddy', 'foreign_key' => 'name' ) );
0 голосов
/ 29 января 2010

Это правильно, только если вы планируете использовать отношения один-к-одному. Однако, если вы планируете иметь отношения один-ко-многим, вы захотите использовать $ has_many. В зависимости от ваших потребностей, вы можете при желании создать модель для другой таблицы и использовать для нее $ own_to.

Здесь все объяснено: http://docs.kohanaphp.com/libraries/orm/starting

...