Параметру $type можно присваивать что-либо из 'all', 'first', 'count', 'list', 'neighbors' or 'threaded'. 'first' – значение по умалчанию.
$params – это массив с любыми, ниже представленными опциями, в качестве индекса:
<?php
array(
'conditions' => array('Model.field' => $thisValue), //массив условий
'recursive' => 1, //int
'fields' => array('Model.field1','Model.field2'), //массив имен полей
'order' => array('Model.created','Model.field3 DESC'),//строка или массив, определяющие порядок
'group' => array('Model.field'), //поля для GROUP BY
'limit' => n, //int
'page' => n, //int
'callbacks' => true //другие возможные значения: false, 'before', 'after'
)
?>
Если вы используете find('list'), индекс 'fields' в $params определяет индекс, значение и группу
<?php
// сгенерированный список будет проиндексирован по Post.id, со значением Post.title
$this->Post->find('list', array('fields'=>'Post.title'));
//сгенерированный список будет проиндексирован по Post.slug, со значением Post.title
$this->Post->find('list', array('fields'=>array('Post.slug', 'Post.title')));
// сгенерированный список будет сгруппирован по Post.author_id, и каждая группа
// проиндексирована по Post.id, со значением Post.title
$this->Post->find('list', array('fields'=>array('Post.id', 'Post.title', 'Post.author_id')));
?>
Если вы хотите использовать метку optgroup из родительской таблицы, установите в параметрах 'recursive'=>1.
Если вы используете find('neighbors'), то индекс 'field' в $params определяет поле для анализа, и индекс 'value' в массиве $params определяет значение по которому определяется следующий и предыдущий. Обратите внимание, что индексы 'field' и 'value' не используются для find('all') – это специальные символы для find('neighbors').
<?php
// допустим у нас есть id от 1 до 10, мы увидим prev, установленное в 1 и next, установленное в 3
$this->Post->id = 2;
$one = $this->Post->find('neighbors');
// Для получения соседних данных, используя другое поле..
$two = $this->Post->find('neighbors', array('field'=>'Post.title', 'value'=>$data['Post']['title']));
// Обратите внимание, что если используете индекс 'fields' для поиска,
//то должен быть определен 'field', иначе это не сработает
$three = $this->Post->find('neighbors', array('field'=>'Post.title', 'value'=>$data['Post']['title'], 'fields'=>array('id', 'title'));
?>
Для обратной совместимости, find также принимает предыдущий синтаксис:
Если вам необходимо использовать SQL операторы такие, как в (MySQL) DISTINCT, MAX, MIN, и др., то вы можете определить их как часть индекса 'fields', например так:
$this->Product->find('all', array('fields'=>'DISTINCT (Product.name) AS product_name'));
Если вы пытаетесь найти уникальную комбинацию полей (например, сгенерируйте sql, подобный, приведенному ниже)
SELECT DISTINCT Client, Job, Description
FROM JOB
WHERE Active=1
GROUP BY Client, Job, Description
ORDER BY Client
Делайте следующее...
<?php
$condition = array(
'conditions' => array('Model.Active =' => 1),
'fields' => array('DISTINCT Model.Client', 'Model.Job', 'Model.Description'),
'order' => array('Model.Client'),
'group' => array('Model.Client', 'Model.Job', 'Model.Description'));
$this->Model->find('all', $condition);
?>
findAll оставлено для совместимости, используйте find('all').
Возвращает указанные поля (количество записей – до, указанного в $limit), согласно условию $conditions (если есть), начинает список со страницы $page (по умолчанию, страница 1). Если в таблице нет указанных полей, то возвращается пустой массив.
Условия $conditions должны быть сформированы так, как бы они выглядели в SQL выражении: $conditions = "Pastry.type LIKE '%cake%' AND Pastry.created_on > '2007–01–01'", например. Добавление в условиях префикса в виде имени модели ('Pastry.type' rather than just 'type') – это хорошая практика, особенно когда в запросе происходит выборка ассоциированных данных.
Присвоение параметру $recursive целого числа заставляет findAll() выбирать данные согласно поведению, описанному ранее в разделе «Переменные модели. $recursive». Не забывайте вручную добавлять требуемые поля внешних ключей в массив $fields, как там описано.
Данные из findAll() возвращаются в виде массива, согласно этому основному формату:
Array
(
[0] => Array
(
[ModelName] => Array
(
[id] => 83
[field1] => value1
[field2] => value2
[field3] => value3
)
[AssociatedModelName] => Array
(
[id] => 1
[field1] => value1
[field2] => value2
[field3] => value3
)
)
[1] => Array
(
[ModelName] => Array
(
[id] => 85
[field1] => value1
[field2] => value2
[field3] => value3
)
[AssociatedModelName] => Array
(
[id] => 2
[field1] => value1
[field2] => value2
[field3] => value3
)
)
)
Эти волшебные функции могут использоваться, как методы быстрого поиска в ваших таблицах по определенному полю. Просто добавьте имя поля (в CamelCase формате ) в конец этой функции, и передайте критерий поиска по этому полю первым параметром.
Эти волшебные функции могут использоваться, как методы быстрого поиска в ваших таблицах по определенному полю. Просто добавьте имя поля (в CamelCase формате ) в конец этой функции, и передайте критерий поиска по этому полю первым параметром.
PHP5 findAllBy<x> Example | Corresponding SQL Fragment |
$this->Product->findAllByOrderStatus('3'); | Product.order_status = 3 |
$this->Recipe->findAllByType('Cookie'); | Recipe.type = 'Cookie' |
$this->User->findAllByLastName('Anderson'); | User.last_name = 'Anderson' |
$this->Cake->findById(7); | Cake.id = 7 |
$this->User->findByUserName('psychic'); | User.user_name = 'psychic' |
Пользователи PHP4 должны использовать эту функции, немного отличную, из-за некоторой нечувствительности регистра в PHP4:
PHP4 findAllBy<x> Example | Corresponding SQL Fragment |
$this->Product->findAllByOrder_status('3'); | Product.order_status = 3 |
$this->Recipe->findAllByType('Cookie'); | Recipe.type = 'Cookie' |
$this->User->findAllByLast_name('Anderson'); | User.last_name = 'Anderson' |
$this->Cake->findById(7); | Cake.id? = 7 |
$this->User->findByUser_name('psychic'); | User.user_name = 'psychic' |
findBy() функции подобны find('first',...), так же, как и findAllBy() функции подобны find('all',...).
В обоих случаях, возвращаемый результат – это массив в таком же формате, как и результат find() или findAll(), соответственно.