Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

вопрос по ORM
http://forum.kohanaframework.su/viewtopic.php?f=33&t=292
Страница 2 из 2

Автор:  AmberLEX [ 08 авг 2012, 11:25 ]
Заголовок сообщения:  Re: вопрос по ORM

Ну да, этот запрос не поможет
Код:
$users = ORM::factory('user')
   ->join('roles_users')
   ->on('user.id','=','roles_users.user_id')
   ->where('roles_users.role_id','!=',2)
   ->find_all();

Автор:  Rush64 [ 08 авг 2012, 22:57 ]
Заголовок сообщения:  Re: вопрос по ORM

модели же получаются связанные. если делать запрос с with()
пример:
Код:
$data = ORM::factory('user')->with('role')->where('role','<>','admin')->find_all();

что-то вроде этого. в таких запросах where относится только к user, или к role тоже

Автор:  AmberLEX [ 08 авг 2012, 23:06 ]
Заголовок сообщения:  Re: вопрос по ORM

Нужно пробовать, но думаю, чтобы использовать with нужно описать связь не через through
with строит тоже join

Автор:  Rush64 [ 09 авг 2012, 10:08 ]
Заголовок сообщения:  Re: вопрос по ORM

нет, не обязательно. through нужно использовать для связи много ко многим, когда нужна связующая табличка. а один ко многим юзает просто фореин кей. with будет работать, но неизвестно или будет работать where для with

Автор:  AmberLEX [ 09 авг 2012, 11:59 ]
Заголовок сообщения:  Re: вопрос по ORM

А что вам дает ->where('role','<>','admin')?
У админа все равно есть роль login

Автор:  mamahtehok [ 09 авг 2012, 13:18 ]
Заголовок сообщения:  Re: вопрос по ORM

where будет относиться толmrj к инициализируемой модели, т.е. к with модели относится не будет.

и да where('role','<>','admin') работать не будет так, как это просто выберет всех строки в которых не присутствует admin, но пользователь с правами admin имеет строку с правами login.
Необходимо еще как-то выкинуть пользователей, которые имеют права admin, из результатов пользователей с правами login.

Автор:  AmberLEX [ 09 авг 2012, 13:52 ]
Заголовок сообщения:  Re: вопрос по ORM

Да этот вариант самый нормальный
Код:
    $login = ORM::factory('role',array('name'=>'admin'))->users->find_all();
    foreach ($login as $user) {
        $ids[] = $user->id;
    }
    $users = ORM::factory('user')->where('id','NOT IN',$ids)->find_all()->as_array();
 
Оформить его методом в модели и все. Потом вызывать типа ORM::factory('user')->get_only_user();
Думаю если наворотить одним запросом, то он будет намного сложнее и не факт, что не будет вложенного.
И не так наверное часто нужен список только из пользователей, без других ролей.
Админ тоже пользователь, зачем его обижать и выкидывать со списка)))
На крайний случай, если нужно распределение по ролям и все сложно, нужно искать соответствующий модуль Kohana ACL или подключить Zend ACL и работать.
Элегантного решения, как вам хотелось наверное нет)

Автор:  Sergey [ 09 авг 2012, 15:36 ]
Заголовок сообщения:  Re: вопрос по ORM

AmberLEX писал(а):
Да этот вариант самый нормальный
Код:
    $login = ORM::factory('role',array('name'=>'admin'))->users->find_all();
    foreach ($login as $user) {
        $ids[] = $user->id;
    }
    $users = ORM::factory('user')->where('id','NOT IN',$ids)->find_all()->as_array();
 


А прикольно получается :)
Я использовал такой код, для получения пола (муж/жен) в котролёре:
Код:
$gender = $this->request->param('gender');
$sex = ORM::factory('sex')->get_by_name($gender);

Ну и ещё мне нужно было в модели написать следующее:
Код:
  public function get_by_name($gender)
  {
    $this->where($this->_object_name.'.name', '=', $gender);
    return parent::find();
  }

Оказалось можно выкинуть из модели этот метод, а в котролёре написать:
Код:
$sex = ORM::factory('sex', array('name' => $gender));

Вот она, вся сила ORM :)

Страница 2 из 2 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/