Набор результатов фильтрации с помощью codeigniter и datamapper

#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();