Kohana - проверить ORM

Я использую Kohana в течение некоторого времени. Я использую "has_many", "has_one", "assign_to" без проблем, мой вопрос:

Если у меня есть 2 таблицы, как это:

tbl_foo1

id | tbl_foo2_id | field1
-------------------------
1  | 2           | bar
2  | 1           | foo

tbl_foo2

id | field1
-----------
1  | foo
2  | bar

У меня должно быть такое отношение: tbl_foo1 принадлежит tbl_foo2, а tbl_foo2 имеет много tbl_foo1. Пока все хорошо.

Проблема в том, когда я пытаюсь сохранить отношение в контроллере. Итак, у меня есть этот код:

$t1 = ORM::factory('tbl_foo1')->values($values, $expected)->create();
$t2 = ORM::factory('tbl_foo2', $_POST['id']);
$t1->tbl_foo2_id = $t2;
$t1->save();

Хорошо, это должно сработать, но я думаю, что это не самое лучшее и не самое красивое решение. По двум причинам: 1 из-за производительности - он выполняет 3 запроса (1, чтобы сохранить $t1, 2, чтобы найти $t2, 3, чтобы сохранить отношения $ t2 с $t1), и 2, потому что он может сохранять пустые записи, потому что он не 't проверить существование записей в $t2.

Итак, мои основные вопросы: как это сделать?


Мое собственное решение

Я использовал решение, которое дал мне Биакаверон, спасибо. Но, тем не менее, была проблема с проверкой... поэтому я потратил некоторое время и нашел решение, используя тот же пример:

$t2 = ORM::factory('tbl_foo2', $_POST['id']);
$t1 = ORM::factory('tbl_foo1')->values($values, $expected);
$t1->foo2 = $t2; // foo2 is a belongs_to relationship
$t1->create();

в tbl_foo1 Модель я добавил функцию правил:

public function rules()
{
    'foo2_id' => array('not_empty')
}

Таким образом, мне не нужно делать еще один запрос, который хорош для производительности, и это простой способ сделать это. И это работает, потому что, когда ORM пытается найти идентификатор модели tbl_foo2, если он не находит его, он возвращает NULL, поэтому он всегда будет пустым, несмотря ни на что!

Примечание. Я также использовал транзакции с БД (потому что это только часть процесса), поэтому, если по какой-либо причине один из запросов прерывается, запрос не будет выполняться. Просто помните, что вы должны использовать один движок базы данных, который поддерживает транзакции (у меня InnoDB).

1 ответ

Решение

1 Вы можете сохранить модель с belongs_to объект:

$t2 = ORM::factory('tbl_foo2', $this->request->post('id'));
if (!$t2->loaded()) 
{
    // wrong ID for tbl_foo2
}

$t1 = ORM::factory('tbl_foo1')->values($values, $expected);
$t1->foo2 = $t2; // foo2 is a belongs_to relationship
$t1->create();

2 Проверьте tbl_foo2_id со специальным обратным вызовом.

Другие вопросы по тегам