TIP: Use Markdown or, <pre> for multi line code blocks / <code> for inline code.
These forums are read-only and for archival purposes only!
Please join our new forums at discourse.kohanaframework.org
AUTH - выборка по ролям
  • Всем привет. Нужно получить всех юзеров с определенной ролью. Например всех администраторов. Можно такое реализовать, не переписывая модуль?

  • $admins = ORM::factory('role', 'admin')->users->select_list('id', 'username'); // ищем всех, кто имеет права admin
  • Ага, спасибо. У меня так получилось

    $executors = ORM::factory('role', 'executor')->where(array('price>=' => $order->post_price_from, 'price<=' => $order->post_price_to))->users;
    
  • Вы можете вносить изменения в модель User_Model, т.к. она изначально пустая. Например, добавить метод, выбирающий этих самых пользователей по имени/id роли с помощью Query Builder'а (так быстрее и одним запросом).
  • Хм. А как можно выбрать например всех пользователей с определёнными ролями и + сделать join с таблицей профайла?
    Так не получается :)
    $webmasters=ORM::factory('role', 'webmaster')->users->with('user_profile')
  • вроде так: )
    $webmasters=ORM::factory('role', 'webmaster')->with('user_profile')->users
  • неа не работает.
    такие запросы формируются
    SELECT `roles`.* FROM (`roles`) WHERE `roles`.`name` = 'webmaster' ORDER BY `roles`.`id` ASC LIMIT 0, 1
    SELECT `user_id` AS `id` FROM (`roles_users`) WHERE `roles_users`.`role_id` = 3
    SELECT `users`.* FROM (`users`) WHERE `users`.`id` IN (1,7) ORDER BY `users`.`id` ASC

    Может ещё какие варианты?
  • попробуйте тогда прописать в модели user параметр load_with. Правда теперь будет профиль будет грузиться всегда, но может это то что вам нужно? :)
  • хм. Прописал

    class User_Model extends Auth_User_Model {
    protected $has_one = array('user_profile');
    protected $load_with = array('user_profile');

    }

    Теперь при запросе он формирует неправильный запрос к БД

    Ошибка SQL: Unknown column 'users.user_id' in 'on clause' - SELECT `users`.*, `user_profile`.`id` AS `user_profile:id`, `user_profile`.`user_id` AS `user_profile:user_id`, `user_profile`.`icq` AS `user_profile:icq`, `user_profile`.`wallet` AS `user_profile:wallet`, `user_profile`.`wmr` AS `user_profile:wmr`, `user_profile`.`percent` AS `user_profile:percent`, `user_profile`.`payments` AS `user_profile:payments`, `user_profile`.`status` AS `user_profile:status`, `user_profile`.`send_mail` AS `user_profile:send_mail` FROM (`users`) LEFT JOIN `user_profiles` AS `user_profile` ON (`user_profile`.`id` = `users`.`user_id`) WHERE `users`.`id` = 11 ORDER BY `users`.`id` ASC LIMIT 0, 1

    что я не так сделал? Замучался уже :(
  • Как у Вас связаны между собой таблицы User_Model и User_Profile_Model? По идее в User_Profile должно быть $belongs_to('user').
    А так получается, что при join'е почему-то внешний ключ ожидается в таблице users, а не в user_profiles.
  • так и есть

    <?php defined('SYSPATH') OR die('No direct access allowed.');<br />class User_profile_Model extends ORM{
    protected $belongs_to = array('user');
    }

    и поидее запрос должен выглядеть так
    FROM `users` AS `users` LEFT JOIN `user_profiles` AS `user_profile`

    разве нет?
  • Должно быть FROM (`users`) LEFT JOIN `user_profiles` as `user_profile` ON (`user_profile.user_id` = `users.id`)

    Вы приводили полные тексты моделей? Возможно, в Auth_User_Model есть что-то паразитное... Попробуйте создать простые модели User_Model и User_profile_Model без наследования от Auth и на них потренироваться. У меня все завелось нормально.
  • всё тоже самое.
    Хотя и сделал как Вы сказали без наследования.

    class User_Model extends ORM {
    protected $has_one = array('user_profile');
    protected $load_with = array('user_profile');

    }

    class User_profile_Model extends ORM{
    protected $belongs_to = array('user');
    }

    $webmasters=ORM::factory('role', 'webmaster')->users;

    Вылезает ошибка:

    При обработке запроса произошла ошибка в базе данных. Пожалуйста, уточните причину ошибки ниже

    system/libraries/drivers/Database/Mysql.php [371]:

    Ошибка SQL: Unknown column 'users.user_id' in 'on clause' - SELECT `users`.*, `user_profile`.`id` AS `user_profile:id`, `user_profile`.`user_id` AS `user_profile:user_id`, `user_profile`.`icq` AS `user_profile:icq`, `user_profile`.`wallet` AS `user_profile:wallet`, `user_profile`.`wmr` AS `user_profile:wmr`, `user_profile`.`percent` AS `user_profile:percent`, `user_profile`.`payments` AS `user_profile:payments`, `user_profile`.`status` AS `user_profile:status`, `user_profile`.`send_mail` AS `user_profile:send_mail` FROM (`users`) LEFT JOIN `user_profiles` AS `user_profile` ON (`user_profile`.`id` = `users`.`user_id`) WHERE `users`.`id` IN (1,7) ORDER BY `users`.`id` ASC
  • А просто $user->user_profile и $user_profile->user работают? Без ролей и $load_with? Надо определить, это проблема связи между данными таблицами или что-то другое
  • Вроде работает, при таком коде:

    $webmaster_profile=ORM::factory('user','1')->user_profile;
    $webmaster=ORM::factory('user_profile','6')->user;

    получаются запросы:
    SELECT `users`.* FROM (`users`) WHERE `users`.`id` = '1' ORDER BY `users`.`id` ASC LIMIT 0, 1
    SELECT `user_profiles`.* FROM (`user_profiles`) WHERE `user_profiles`.`user_id` = 1 ORDER BY `user_profiles`.`id` ASC LIMIT 0, 1
    SELECT `user_profiles`.* FROM (`user_profiles`) WHERE `user_profiles`.`id` = '6' ORDER BY `user_profiles`.`id` ASC LIMIT 0, 1
    SELECT `users`.* FROM (`users`) WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 0, 1

    т.е. всё как вроде и должно быть.
    но блин я уже паникую :)
    даже такая конструкция перестала работать
    $webmaster_profile=ORM::factory('user')->with('user_profile')->find_all();
  • Всё нашёл! Ура :)
    В БД PK забыл проставить для user_id
    Спасибо за помощь!
  • with() в обе стороны не работает? Или только при $user->with('user_profile')?

    Не понял, при чем тут БД? :) Ведь ошибка на уровне формирования запроса Коханой...
  • А ещё вопрос по AUTH. Если я делаю так: if (!Auth::instance()->logged_in('admin')) { url::redirect('/'); }

    порождается запрос в БД SELECT roles.* FROM (roles) WHERE roles.name = 'admin' ORDER BY roles.id ASC LIMIT 0, 1

    а соответственно если я делаю несколько похожих конструкций, то таких запросов много плодится. как бы этого получше избежать?

  • Насколько я помню, в рамках выполнения скрипта одинаковые запросы кэшируются (если включена соответствующая опция в конфиге)
  • а фиг знает! Поставил в БД для user_id Индекс Primary и всё заработало с правильными запросами.

  • После PHP 5.4.20:

    $admins = ORM::factory('Role', ['name'=>'admin'])->users->find_all();

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

In this Discussion