Выборка пользователей по определенным параметрам

Здравствуйте.
Нужно получить выборку активных (не забаненых и т.д.) пользователей, со всеми их полями, принадлежащих группе с id 4, от имени которых (createdby) существуют ресурсы, принадлежащие контексту moscow и опубликованные в данный момент.
Нужен нормальный запрос с $modx->newQuery(). Что бы потом можно было foreach $users… $user->get('username') получил имя пользователя, или например дополнительное поле пользователя extended.specialisation и другие.

Я вроде верно написал запрос в обычном синтаксисе, помогите пожалуйста с xPDO или как его зовут))

SELECT u.username, ua.* FROM `modx_users` as u
LEFT JOIN modx_member_groups as g ON g.member = u.id
LEFT JOIN modx_site_content as c ON c.createdby = u.id
LEFT JOIN modx_user_attributes as ua ON ua.internalKey = u.id
WHERE g.user_group = 4
AND c.published = 1
AND u.active = 1
AND c.context_key = 'moscow'
GROUP BY u.id
Спасибо заранее!
Ivan
26 октября 2016, 18:04
modx.pro
3
3 525
0

Комментарии: 12

Ivan
28 октября 2016, 16:21
0
ап)
    Илья Уткин
    28 октября 2016, 20:41
    +1
    $sql = "SELECT u.username, ua.* FROM `modx_users` as u
    LEFT JOIN modx_member_groups as g ON g.member = u.id
    LEFT JOIN modx_site_content as c ON c.createdby = u.id
    LEFT JOIN modx_user_attributes as ua ON ua.internalKey = u.id
    WHERE g.user_group = 4
    AND c.published = 1
    AND u.active = 1
    AND c.context_key = 'moscow'
    GROUP BY u.id";
    $q = $modx->prepare($sql);
    $q->execute();
    $users = $q->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($users as $v) {
    	echo $v['username'];
    }
      Ivan
      29 октября 2016, 18:47
      0
      Извините, но так я и сам умею)) я ждал что-то вроде:
      $xpdo->newQuery('Box',array(
         'width:>' => 10,
      ));
      Просто вроде как такие запросы лучше чем обычный запрос. Может быть вы умеете?
        Илья Уткин
        29 октября 2016, 19:00
        +1
        Хех))) завтра буду у компа, попробую помочь. А пока вот пример джойна на xPDO: ilyaut.ru/cheats/sample-resources-filled-with-tv-settings/
          Ivan
          29 октября 2016, 19:02
          0
          Спасибо. Сегодня попробую)
          Andrei D.
          30 октября 2016, 05:06
          0
          а чем такие запросы лучше?
            Илья Уткин
            30 октября 2016, 08:34
            0
            Они безопаснее, если в них будут подставляться какие-то пользовательские данные.

            Например, когда вы захотите сделать поиск по выбранным строкам с помощью
            "...
            AND `username` LIKE = '%{$_GET['search']}%'
            ..."
            можно получить XSS
              Ivan
              30 октября 2016, 11:38
              0
              prepare подготавливает запрос) И тоже защищает от этого, если правильно писать запрос)
        Илья Уткин
        31 октября 2016, 08:32
        0
        Как-то так получилось. Запрос несложный, надо учиться такие составлять))

        $q = $modx->newQuery('modUser');
        $q->leftJoin('modUserGroupMember',
                     'UserGroup',
                     'UserGroup.member = modUser.id '.
                     'AND UserGroup.user_group = 4');
        $q->leftJoin('modResource',
                     'Resource',
                     'Resource.createdby = modUser.id '.
                     'AND Resource.published = 1 '.
                     'AND Resource.context_key = "moscow"');
        $q->leftJoin('modUserProfile',
                     'Profile',
                     'Profile.internalKey = modUser.id');
        $q->groupby('modUser.id');
        
        $q->select(array(
            'modUser.*',
            'Profile.*'
        ));
        
        $q->where(array(
            'modUser.active' => 1,
            'Resource.id:IS NOT' => NULL
        ));
        
        $count = $modx->getCount('modUser', $q);
        if ($q->prepare() && $q->stmt->execute()) {
        	$users = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
        }
        
        echo "<p><b>Всего пользователей найдено: {$count}</b></p>";
        foreach($users as $user) {
            echo "<p>{$user['username']} ({$user['internalKey']})</p>";
        }
          Ivan
          31 октября 2016, 11:41
          0
          Спасибо большое. Сегодня потестирую. Я бы сам написал, но я не знал какие имена таблиц использовать. В смысле вот если из site_content нужно использовать modResources и т.д.
            Илья Уткин
            01 ноября 2016, 08:53
            +1
            Вот здесь можно подсмотреть: ilyaut.ru/modx-object-full-reference/
              Ivan
              03 ноября 2016, 10:33
              0
              Спасибо большое. Прочитал давно ответитьзабыл. Очень крутая табличка. Именно это и нужно было, не знал как загуглить)))
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          12