Обновление таблиц Kohana 3 с использованием Query Builder

Как правильно построить обновление кросс-таблицы в Kohana 3, используя построитель запросов БД?

В настоящее время я просто использую DB::expr, но я знаю, что построитель запросов умнее этого.

// update record
$rows_updated = DB::update(DB::expr('user_list_permissions INNER JOIN users ON user_list_permissions.user_id = users.id'))
->set($params)
->where('user_list_permissions.id', '=', $user_list_permission_id)
->where('users.account_id', '=', $this->account_id)
->execute();

И да, конечно, я пытался использовать метод join, как при создании запросов SELECT, но я получаю сообщение об ошибке:

ErrorException [ 1 ]: Call to undefined method Database_Query_Builder_Update::join()

2 ответа

Таким образом, вы используете выражение для объединения, можно использовать встроенную функцию join для функции on для достижения этого поведения.

Так что в вашем примере это будет выглядеть примерно так:

$rows_updated = DB::update('user_list_permissions')
->join('users','INNER')
->on('user_list_permissions.user_id','=','users.id')
->set($params)
->where('user_list_permissions.id', '=', $user_list_permission_id)
->where('users.account_id', '=', $this->account_id)
->execute();

Там не так много, но в документах есть немного на http://kohanaframework.org/3.2/guide/database/query/builder

Это старый пост, но только для того, чтобы вести учет моего опыта в Кохане.

Если вы используете MySQL, он позволяет вам выполнять обновление между таблицами, избегая использования объединения следующим образом:

UPDATE table1, table2
SET table1.some_field = 'some_value'
WHERE table1.foreign_key = table2.primary_key AND table2.other_field = 'other_value' 

Обратите внимание, что условие table1.foreign_key = table2.primary_key такое же, как вы использовали в предложении ON с JOIN. Таким образом, вы можете написать обновление кросс-таблицы в Kohana, следуя этому шаблону, избегая JOIN:

$rows_updated = DB::update(DB::expr('user_list_permissions, users'))
->set($params)
->where('user_list_permissions.user_id', '=', DB::expr('users.id'))
->where('user_list_permissions.id', '=', $user_list_permission_id)
->where('users.account_id', '=', $this->account_id)
->execute();
Другие вопросы по тегам