These are chat archives for 2x2studio/2x2

2nd
Feb 2016
Crow
@2x2studio
Feb 02 2016 12:41

@bobdubnod
Всем привет! Я что-то запутался и не могу разобраться. Может кто-нибудь подсказать, чтобы я разобрался и уже смог понимать (а дальше уже доки будет просто читать).
Суть в следующем:
есть таблицы в базе (MySQL): groups, contacts, contact_groups, contact_phones
соответственно, связи: contacts.group_id = contact_groups.contact и contact_groups.group_id = groups.id, а contacts.phone = contact_phones.phone (такая логика))
Как можно с ORM или хотя бы Database сделать соответствующий запрос?

SELECT COUNT(cp.id) cpCount FROM groups g, contacts c, contact_phones cp, contact_groups cg WHERE g.id = 2 AND cg.group_id = g.id AND c.id = cg.contact AND c.id = cp.contact;

Или хотя бы примерно?
@bobdubnod


                $usersCount = $usersQuery
                    ->table('contacts', 'c')
                    ->join('contact_groups', 'g')
                        ->on('g.contact', 'c.id')
                    ->where('g.group_id', $id)
                    ->fields(array('count'=> $database->sqlExpression('COUNT(c.id)')))
                    ->execute()
                    ->asArray(true);
                $phonesCount = $phonesQuery
                    ->table('contacts', 'c')
                    ->join('contact_groups', 'g')
                        ->on('g.contact', 'c.id')
                    ->join('contact_phones', 'p', 'left')
                        ->on('p.contact', 'c.id')
                    ->where('g.group_id', $id)
                    ->fields(array('count'=> $database->sqlExpression('COUNT(p.id)')))
                    ->execute()
                    ->asArray(true);
var_dump($usersCount[0]->count, $phonesCount[0]->count);

лучше пока не смог придумать)
@Linfuby

        // Получаем сущность группы
        $group = $this->orm()->query('group')->in(2)->findOne();
        // Получаем запрос Контактов и фильтруем по сущности группы
        echo $this->orm()->query('contact')->relatedTo('group', $group)->count();
        // Получаем запрос Телефонов и фильтруем по сущности группы через Котакты
        echo $this->orm()->query('phone')->relatedTo('contact.group', $group)->count();

Конечно contacts должно быть связано в конфиге ORM с группой, а телефоны с контактами

// Связь контакта c телефонами (Один Контакт ко многим телефонам)
return array(
    'type'         => 'oneToMany',
    'owner'        => 'contact',
    'items'        => 'phone',
    'ownerOptions' => array(
        'itemsProperty' => 'phones',
    ),
    'itemsOptions' => array(
        'ownerProperty' => 'contact',
        'ownerKey'      => 'contact_id',
    ),
);
// Связь Контакта с группой (Одна группа ко многим контактам.  Если наоборот - поменять местами имена моделей)
return array(
    'type'         => 'oneToMany',
    'owner'        => 'group',
    'items'        => 'contact',
    'ownerOptions' => array(
        'itemsProperty' => 'contacts',
    ),
    'itemsOptions' => array(
        'ownerProperty' => 'group',
        'ownerKey'      => 'group_id',
    ),
);