#codeigniter #filter #resultset #codeigniter-datamapper
#codeigniter #Фильтр #набор результатов #codeigniter-datamapper
Вопрос:
У меня небольшая проблема с datamapper, и я хотел бы знать, есть ли быстрое решение. Допустим, у меня есть такие данные
Таблица групп
id | Name
1 | admin
2 | guest
3 | editor
4 | moderator
В моем базовом контроллере я установил глобальное поле для просмотра только групп, которые не являются администраторами
$this->groups_ = new Group();
$this->groups_->where('id >', 1)->get();
//so I can select the users that are not admin
$users = new User();
$users->where_related('group',$id,$this->groups_)->get();
Теперь в моих контроллерах я хотел бы отфильтровать группы. Например, я хочу выбрать только редакторов и гостей (идентификатор от 1 до 4). Итак, я хотел бы отфильтровать начальный результирующий набор … что-то вроде этого
$this->groups_->where('id <',4)->get();
Но это не работает. Он возвращает ВСЕ идентификаторы группы <4, включая admin.
Каков был бы правильный способ получить это?
Ответ №1:
Ну, datamapper не запрашивает объекты или группы объектов. Он запрашивает базу данных. Поэтому, когда вы выполняете второй get()
, вы выполняете отдельный запрос к базе данных.
Вы можете это сделать, но это будет дополнительный запрос:
$this->groups_->where('id >', 1)->where('id <', 4)->get();
или вы можете выполнить цикл $this->groups_
после вашего первого запроса в php и отфильтровать набор там и сохранить как массив.
Ответ №2:
Возможное решение
Возможно, я нашел возможное обходное решение, клонировав объект datamapper. Что я хочу сделать, так это не запрашивать базу данных несколько раз, но я хотел бы иметь базовый набор результатов и уточнить результаты.
Итак, в моем базовом контроллере я бы сделал что-то вроде
$this->groups_ = new Group();
$this->groups_->where('id >', 1);//without getting the results
//so I can select the users that are not admin
$users = new User();
//here i'm getting the results from the clone
$users->where_related('group',$id,$this->groups_->get_clone()->get())->get();
И, поскольку я оставил объект «открытым», не получив результатов, я могу использовать его в своих контроллерах в качестве основы для других моих «запросов» … хорошо, на самом деле это новые условия первого запроса.
//now the query return the groups between 2, as I set in the base controller
//and 4, set in the child controller
$this->groups_->where('id <',4)->get();