CakePHP 3-根据joinTable结果数据的查询匹配条件

CakePHP 3-根据joinTable结果数据的查询匹配条件,php,sql,cakephp,orm,cakephp-3.x,Php,Sql,Cakephp,Orm,Cakephp 3.x,我正在尝试创建一个查询,该查询根据可联接的结果返回公司 我有三张桌子: 公司、单位和用户 Companies belongsTo Units Units hasMany Companies Users belongsToMany Units - ['joinTable' => 'users_units'] Users belongsToMany Companies, ['joinTable' => 'users_companies'] Units belongsToMany Us

我正在尝试创建一个查询,该查询根据可联接的结果返回公司

我有三张桌子: 公司、单位和用户

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
连接表:

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

UsersCompanies belongsTo Users
UsersCompanies belongsTo Companies
我希望根据两个条件获得所有公司:

一个条件是:

UsersCompanies同时具有用户id和公司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”的列,这意味着与此记录相关的播放器是一个单元管理员

当我得到公司记录时,我会收到一个单位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')
我希望你们能理解

如果不清楚,请告诉我


附言: 只是想让你们知道

目前,我有一个解决方案:

// 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());
有没有更好的方法来实现这一点