原来你不能。至少不能使用上面提供的语法,也不能使用cakephp1.2.6。我检查了来源(耶!到开源框架!)找到了文件
cake/libs/model/datasources/dbo_source.php
它包含连接的代码。
DboSource::renderStatement()
哪条路走的很浅
$query['joins']
数组,通过
DboSource::buildJoinStatement($join)
,它对参数进行整理(填空等),然后调用
DboSource::renderJoinStatement
创建单个join子句的SQL片段。
我:
我被告知不要在报纸上编辑东西
cake/libs
dbo_source.php
app/models/datasources/
用于编辑。然后,我拿起斧子,重构了这条浅浅的小路
$query['joins']
数组输入
DboSource::renderStatement()
DboSource::buildJoinStatementArray()
产生这两种方法:
function buildStatement($query, $model) {
$query = array_merge(array('offset' => null, 'joins' => array()), $query);
# refactored (extract method) to make recursion easier
$query['joins'] = $this->buildJoinStatementArray($query['joins']);
return $this->renderStatement('select', array(
'conditions' => $this->conditions($query['conditions'], true, true, $model),
'fields' => implode(', ', $query['fields']),
'table' => $query['table'],
'alias' => $this->alias . $this->name($query['alias']),
'order' => $this->order($query['order']),
'limit' => $this->limit($query['limit'], $query['offset']),
'joins' => implode(' ', $query['joins']),
'group' => $this->group($query['group'])
));
}
/**
* Replaces the join statement array syntax with SQL join clauses.
*/
function buildJoinStatementArray($joins) {
if (!empty($joins)) {
$count = count($joins);
for ($i = 0; $i < $count; $i++) {
if (is_array($joins[$i])) {
$joins[$i] = $this->buildJoinStatement($joins[$i]); # $joins[$i] now contains something like "LEFT JOIN users As User on User.group_id = Group.id"
}
}
}
return $joins;
}
曾经我有
DboSource::buildJoinStatementArray()
,是时候改变了
DboSource::buildJoinStatement()
-我只是加了张支票
$data['joins']
另一种渲染方法是:
function buildJoinStatement($join) {
$data = array_merge(array(
'type' => null,
'alias' => null,
'table' => 'join_table',
'conditions' => array()
), $join);
if (!empty($data['alias'])) {
$data['alias'] = $this->alias . $this->name($data['alias']);
}
if (!empty($data['conditions'])) {
$data['conditions'] = trim($this->conditions($data['conditions'], true, false));
}
# allow for nested joins
if (!empty($data['joins']) and is_array($data['joins'])) {
$data['joins'] = $this->buildJoinStatementArray($data['joins']);
return $this->renderNestedJoinStatement($data);
}
else
{
return $this->renderJoinStatement($data);
}
}
新的
renderNestedJoinStatement()
方法与
DboSource::renderJoinStatement()
:
/**
* Renders a final SQL JOIN that contains nested join statements
*
* @param array $data
* @return string
*/
function renderNestedJoinStatement($data) {
extract($data);
$nestedJoins = implode(' ', $joins);
return trim("{$type} JOIN ({$table} {$alias} {$nestedJoins})ON ({$conditions})");
}