Перебор записей БД по одной CakePHP 2.x

Тот редкий случай, когда не хочется выбирать все записи сразу, а есть желание выбирать по одной. Как в PHP с помощью mysql_query() / mysql_fetch_row().

В документации на Cake ничего похожего не описано, но возможность такая все-таки есть. По крайней мере в случае Mysql (и, видимо, других источников данных БД).

Модель CakePHP обращается к экземпляру класса Datasource для выборки данных, однако, на самом деле, это экземпляр класса DboSource, наследник Datasource. А у DboSource есть методы execute() и fetchRow(). Поэтому такая конструкция вполне работает:

Внутри модели, конечно, все тоже работает. Просто я из контроллера пробовал :) Как правильно, в соответствии с CakeWay, составлять строку запроса сами разберетесь, не новички.

Особенности межплагинного взаимодействия

Конечно, вызывать методы классов плагина из другого плагина не очень хорошо. Но, тем не менее. Чтобы впоследствии не было мучительно больно, при объявлении связей между моделями, надо всегда указывать свойство className, причем полностью, т.е. ‘Plugin.MyModel’. Иначе возможны весьма забавные эффекты. Справедливо для версий 1.2 и 1.3. Дальше немного кода.

Читать далее Особенности межплагинного взаимодействия

Производительность pagination в CakePHP 1.2

Хотя использование разбивки на страницы (pagination) вполне заслуживает отдельного, обстоятельного поста, хочу остановиться лишь на паре не слишком очевидных моментов. Я предполагаю, что у читающих этот пост есть определенный навык использования CakePHP, моделей вообще и pagination в частности. Этот пост и так получается длинным.

Известно, что метод контроллера paginate() вызывает последовательно два метода модели — первый для подсчета общего числа записей, удовлетворяющих заданным условиям, и второй на выборку указанного числа записей начиная с заданной. Т.е. первый это фактически функция SQL COUNT(*), второй — SELECT … LIMIT n,m.

Именно из-за того, что вызовов методов больше одного, не срабаывает временная привязка/отвязка подчиненных моделей с помощью bindModel()/unbindModel(). Этим методам, для корректной работы с paginate() приходится передавать второй параметр, равный false. К счастью, еть ContainableBehavior, решающий эту проблему.

Эти запросы не всегда оптимальны и есть возможность улучшить производительность метода paginate() именно за счет оптимизации собственно самих запросов. Читать далее Производительность pagination в CakePHP 1.2

Методы модели findBy и findAllBy

В документации как-то очень мельком упомянуты эти методы. Кроме того описание этих методов выглядит так:

findBy<fieldName>(string $value)

Хотя на самом деле это не совсем соответствует действительности. Для поиска одной записи по значению одного поля описание должно выглядеть так:

findBy<fieldName>(string $value, $fields=null, $order=null, $recursive=null)

и

finAlldBy<fieldName>(string $value, $fields=null, $order=null, $limit=null, $page=null, $recursive=null)

Разница есть. Лично я очень обрадовался параметру $recursive — не надо отдельно, перед вызовом метода устанавливать это значение или ображаться к Containable.

Но и это еще не все! Читать далее Методы модели findBy и findAllBy