Kohana 3使用“查询”构建器进行跨表更新

时间:2012-07-03 15:52:40

标签: kohana kohana-3 kohana-db

使用数据库查询构建器在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 个答案:

答案 0 :(得分:2)

因此,您正在使用表达式进行连接,可以在“on”函数上使用内置的“join”函数来实现此行为。

因此,在您的示例中,它看起来像:

$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#joins

答案 1 :(得分:0)

这是一个古老的帖子,但只是为了记录我在Kohana的经历。

如果您使用的是MySQL,它可以让您进行跨表更新,避免使用join,如下所示:

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 与您在带JOIN的ON子句中使用的条件相同。因此,您可以在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();