Как обрабатывать отношение принадлежащие к Kohana ORM - PullRequest
2 голосов
/ 27 декабря 2011

Допустим, у меня есть 2 модели:

class Model_Student extends ORM
{
    protected $_table_columns = array(
        'student_id' => array(),
        'first_name' => array(),
        'last_name' => array()
    );

    protected $_has_one = array(
        'phone' => array()
    )
}

и

class Model_Phone extends ORM
{
    protected $_table_columns = array(
        'student_id' => array(),
        'number' => array(),
    );

    protected $_belongs_to = array(
        'student' => array()
    )
}

Как создать новый объект телефона и добавить его к пользователю?

Это правильный путь?

$student = ORM::factory('student', 1); // Load student with id=1
$phone = ORM::factory('phone');
$phone->student_id = $student->student_id;
$phone->number = '1234567890';
$phone->save();

В этом случае я установил соединение вручную:

$phone->student_id = $student->student_id;

Может ли ORM установить это соединение автоматически?Если да, то как?

Я хотел бы сделать что-то вроде этого:

$student = ORM::factory('student', 1); // Load student with id=1
$phone = ORM::factory('phone');
$phone->number = '1234567890';
$student->add('phone', $phone);

Но add - это (как я знаю) для многих и многих соединений.Так как же сохранить модель телефона и прикрепить ее к пользователю?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Если вы хотите использовать PK, отличный от 'id' (student.student_id), убедитесь, что ваша модель знает это:

class Model_Student extends ORM
{
    protected $_primary_key = 'student_id';

    protected $_table_columns = array(
        'student_id' => array(),
        'first_name' => array(),
        'last_name' => array()
    );

    protected $_has_one = array(
        'phone' => array()
    )
}

Также вы можете опустить $ _table_columns - просто позвольте Kohana обнаруживать их самостоятельно.

А по поводу отношений: вы можете сделать это:

$student = ORM::factory('student', 1); // Load student with id=1
$phone = ORM::factory('phone');
$phone->student = $student;
$phone->number = '1234567890';
$phone->save();

// ------------

$phone = ORM::factory('phone', 1);
echo $phone->student->first_name;

// ------------

$student = ORM::factory('student', 1);
echo $student->phone->number;
1 голос
/ 27 декабря 2011

AFAIK, такого метода для отношений один к одному не существует. Таким образом, ваш правильный способ сделать это:

$student = ORM::factory('student', 1); // Load student with id=1
$phone = ORM::factory('phone');
$phone->student_id = $student->student_id;
$phone->number = '1234567890';
$phone->save();

Но в вашем случае не хотите хранить телефон в отдельной таблице, так как это только усложнит ситуацию. Просто добавьте телефонный столбец в таблицу пользователей.

...