lithium\data\source\Database::_queryExport()
Helper method for Database::read()
to export query while handling additional joins
when using relationships and limited result sets. Filters conditions on subsequent
queries to just the ones applying to the relation.
Parameters
-
object
$query
The query object.
Returns
arrayThe exported query returned by reference.
Source
protected function &_queryExport($query) {
$data = $query->export($this);
if (!$query->limit() || !($model = $query->model())) {
return $data;
}
foreach ($query->relationships() as $relation) {
if ($relation['type'] !== 'hasMany') {
continue;
}
$pk = $this->name($model::meta('name') . '.' . $model::key());
$result = $this->_execute($this->renderCommand('read', [
'fields' => "DISTINCT({$pk}) AS _ID_"] + $data
));
$ids = [];
foreach ($result as $row) {
$ids[] = $row[0];
}
if (!$ids) {
$data = null;
break;
}
$conditions = [];
$relations = array_keys($query->relationships());
$pattern = '/^(' . implode('|', $relations) . ')\./';
foreach ($query->conditions() as $key => $value) {
if (preg_match($pattern, $key)) {
$conditions[$key] = $value;
}
}
$data['conditions'] = $this->conditions(
[$pk => $ids] + $conditions, $query
);
$data['limit'] = '';
break;
}
return $data;
}