我正在尝试创建一个基于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());
有没有更好的方法来实现这一目标?