Phalcon\Mvc\Model::find() вместе с Phalcon\Mvc\Model\Query\Builder

Я пытаюсь использовать объект Phalcon\Mvc\Model\Query\Builder вместе с методом Phalcon\Mvc\Model::find() для настройки поведения загрузки данных.

Все строки модели в таблице имеют поле «record_status», которое используется для отметки активных/неактивных записей.

Я намерен расширить методы Model::find() и Model::findFirst(), чтобы всегда добавлять ограничение «record_status=1» ко всем моим запросам модели. Но пока я просто пытаюсь передать объект Query\Builder в метод ::find() извне:

class User extends Phalcon\Mvc\Model
{
}

$user = new User();

/**
 * @var Phalcon\Mvc\Model\Query\Builder
 */
$query = $user->getModelsManager()->createBuilder();

$query->where('email = :email:', [
    'email' => '[email protected]'
])->andWhere('record_status = :status:', [
    'status' => 1
])->from('users');

$found = $user->find($query);

foreach ($found as $foundUser) {
    ...
}

Проблема в том, что ->find($query) возвращает ВСЕ строки из базы данных, игнорируя предложения WHERE со значением $query.

При проверке свойств $query и $user я вижу следующие соответствующие защищенные свойства:

$query::_conditions = '(email = :email:) AND (record_status = :status:)';
$query::_bindParams = array(
    'email' => '[email protected]',
    'status' => 1
);

$user::_count = 4; // This is wrong, this corresponds to TOTAL number of rows
$user::_result->_bindParams = NULL; // Bound parameters have disappeared
$user::_result->_sqlStatement = 'SELECT `users`.`id`,  `users`.`email`, `users`.`record_status` FROM `users`'; // As you can see, there is no WHERE clause

У меня Phalcon 1.3.0, PHP 5.5.1.

Я ожидаю, что методы find() и findFirst() примут объект Query\Builder() и получат правильные записи. Это ошибка или я неправильно к ней подхожу?

Спасибо, Темури.


person temuri    schedule 23.09.2013    source источник


Ответы (1)


Да у тебя что-то не так.

Функции Model::find() и Model::findFirst() принимают массивы, int или строки и являются оболочками для построителя запросов.

У вас есть как минимум два варианта:

а) использовать конструктор запросов напрямую:

// ... here is your query builder script as in question
$results = $query->getQuery()->execute();
$firstFound = $results->getFirst();

б) передать массив в Model::findFirst():

$firstFound = User::findFirst(
    array(
        '(email = :email:) AND (record_status = :status:)',
        'bind' => array('email' => '[email protected]', 'status' => 1)
   )
);
person jodator    schedule 23.09.2013
comment
Хотелось бы, чтобы это было так просто. Пожалуйста, посмотрите на эту тему: forum.phalconphp.com/discussion/936/ - person temuri; 23.09.2013