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
со специальным обратным вызовом.