CakePHP 3 - 查询匹配条件取决于joinTable结果数据

时间:2016-12-27 08:26:26

标签: php sql cakephp orm cakephp-3.x

我正在尝试创建一个基于joinTable结果返回公司的查询

我有3张桌子: 公司,单位和用户

Companies belongsTo Units
Units hasMany Companies

Users belongsToMany Units - ['joinTable' => 'users_units']
Users belongsToMany Companies, ['joinTable' => 'users_companies']

Units belongsToMany Users - ['joinTable' => 'users_units']);

Companies belongToMany Users

JoinTables:

UsersUnits belongsTo Users - ['joinTable' => 'users_companies']
UsersUnits belongsTo Units

UsersCompanies belongsTo Users
UsersCompanies belongsTo Companies

我希望所有公司都有两个条件:

一个条件是:

UsersCompanies同时包含user_id和company_id

我通过使用:

实现了这一目标
$query = $this->find()->orderAsc('Companies.name');
if ($userId)
    $query->matching(
            'Users',
            function ($q) use ($userId)
            {
                return $q->where(['Users.id' => $userId]);
            }
        );
$query->matching('Units');

现在我想解释另一个条件

UsersUnits表有一列名为“admin”,这意味着与此记录相关的播放器是一个单位管理员。

当我收到公司记录时,我会收到unit_id。

我想检查玩家是否是公司单位的管理员

根据它,我希望得到该部门的所有公司,否则,我想只获得与玩家相关的公司

例如:

Companies->find('all')

Get unit_id

unit_id -> Units->matching('Users',
    function ($q) use ($userId)
    {
        return $q->where(['Users.id' => $userId]);
    }
)

if (UsersUnits.admin == 1)
    Units->contain('Companies')
else
    Companies->matching('Units')

我希望你们明白

如果不是那么清楚,请告诉我

PS .: 只是为了让你们知道

目前我有这个解决方案:

// In Companies Model
$query1 = $this
    ->Units
    ->find('list',
        [
            'keyField' => 'name',
            'valueField' => 'id'
        ]
    )
    ->matching(
        'Users',
        function ($q) use ($userId)
        {
            return $q
                ->where(['Users.id' => $userId])
                ->where(['UsersUnits.admin' => true]);
        }
    );

$query1Array = $query1->toArray();

$query2 = $this
    ->find('list',
        [
            'keyField' => 'name',
            'valueField' => 'id'
        ]
    )
    ->matching('Units')
    ->orderAsc('Companies.name');

if(count($query1Array) > 0)
    $query2->where(['Units.id IN' => $query1Array]);

$query3 =
    $this->find('list',
        [
            'keyField' => 'name',
            'valueField' => 'id'
        ]
    )
    ->matching('Users',
        function ($q) use ($userId, $query1Array)
        {
            return $q
                ->where(['Users.id' => $userId]);
        }
    );

$result = array_merge($query2->toArray(), $query3->toArray());

有没有更好的方法来实现这一目标?

0 个答案:

没有答案