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