Виртуальное поле в «полях» найти условие - Cakephp - PullRequest
2 голосов
/ 13 октября 2011

У меня есть модель Стьюдента с виртуальным полем:

    var $virtualFields = array(
    'full_name' => 'CONCAT(Student.fname, " ", Student.lname)'
);

Я выполняю операцию поиска для извлечения определенных полей, используя 'fields':

$this->Student->find('all', array('fields' => array('Student.fname','Student.lname')));

По некоторым причинам,виртуальное поле не создается после поиска записей.Я попытался добавить Student.full_name, но, конечно, это дает ошибку unknown column в mysql.

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 13 октября 2011

Вы не можете указать в полях виртуальное поле, которое нужно вызывать, без опции полей, поэтому оно приносит результаты ... Вы можете прочитать примеры в кулинарной книге

вызов всех полей - это одна опция, другая - вызывать поле в опции полей, что-то вроде этого

$this->Student->find('all', array('fields' => array(
    $this->student->virtualFields['full_name'].'AS Student__full_name',
    'Student.fname','Student.lname')
));
1 голос
/ 07 февраля 2016

В кулинарной книге: http://book.cakephp.org/2.0/en/models/virtual-fields.html

Там написано, что вы можете использовать его как:

Модель:

public $virtualFields = array(
'name' => 'CONCAT(User.first_name, " ", User.last_name)');

Контроллер или просмотр:

$results = $this->User->find('first');

Результат:

array(
    [User] 
        [first_name] => 'Mark',
        [last_name] => 'Story',
        [name] => 'Mark Story',
        //more fields.
    )

Так что вы можете использовать это так:

$this->set('list_fields', $this->User->find('list', 
array('fields' => array('first_name', 'last_name', 'name'), 
'recursive' => -1, 'condition' => ...)));
1 голос
/ 13 октября 2011

как насчет размещения метода в вашем app_model.php следующим образом:

/**
 * combine virtual fields with fields values of find()
 * USAGE:
 * $this->Model->find('all', array('fields' => $this->Model->virtualFields('full_name')));
 * @param array $virtualFields to include
 */
public function virtualFields($fields = array()) {
    $res = array();
    foreach ((array)$fields as $field) {
        //TODO: if key numeric => value sql!
        //TODO: allow combined/other models via Model.field syntax
        $sql = $this->virtualFields[$field];
        $res[] = $sql.' AS '.$this->alias.'__'.$field;
    }
    return $res;
}

, а затем использовать его следующим образом:

$this->Model->find('all', array('fields' => $this->Model->virtualFields('full_name')))

));

или так:

$fields = $this->Model->virtualFields('full_name');
$fields = am($fields, 'status', 'created');
$this->Model->find('all', array('fields' => $fields));

));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...