Простая фильтрация для MongoDB может быть легко достигнута следующим образом:
Item::all(array('conditions' =>
array('myfield' => array(
'$nin' => array(1,2,3)
))
));
Если это то, чем вы часто занимаетесь, вы можете даже создать для этого собственный поисковик:
class MyModel extends \lithium\data\Model {
public static function __init()
{
parent::__init();
static::finder('notin', function($self, $params, $chain) {
// Take all array keys that are not option keys
$array = array_diff_key($params['options'],
array_fill_keys(array('conditions', 'fields','order','limit','page'),0));
// Clean up options leaving only what li3 expects
$params['options'] = array_diff_key($params['options'], $array);
$params['options']['conditions'] = array(
'myfield' => array(
'$nin' => $array
)
);
return $chain->next($self, $params, $chain);
});
}
}
И назовите это так:
MyModel::notin(array(1,2,3));
Таким же образом вы можете создать собственный поисковик для источников MySQL.
Как вы, вероятно, видите, это создает некоторые проблемы, если вы передаете что-то вроде array('fields'=>$array)
, так как это перезапишет параметр. Что происходит, так это то, что ::notin()
(искатели в целом) имеют отличное поведение для (массивной, нулевой) подписи. Если это произойдет, он считает, что первый массив является опциями, и средство поиска не принимает аргументов. Использование notin($array,array())
прерывает предыдущий поиск, потому что первый аргумент заканчивается в $params['notin']
, когда передается реальный второй аргумент (параметры).
Если вы смешиваете источники данных на лету здесь, я бы создал пользовательскую модель, которая не наследует \lithium\data\Model, и делегирует ее
различным моделям и создает условия на основе источника данных конечных моделей.
class MyFacadeModel {
public static function byNotIn($conditions, $source) {
return ($source == "mongodb")
? $source::find( $rewrittenConditions)
: $source::find( $rewrittenConditionsForMysql );
}
}
(Код может быть немного неверным, так как он в основном взят из моей головы)
person
Nervetattoo
schedule
16.02.2011