Как искать через массив в AuthComponent :: user ()?

Я разрабатывал приложение в CakePHP 2.6, в котором сотрудник изначально принадлежал только одному отделу, однако теперь системные требования изменились, и между персоналом и отделом существуют отношения HasAndBelongsToMany (HABTM).

Теперь это становится проблемой, когда я показываю информацию только тем сотрудникам, которые принадлежат к определенному отделу в представлении, так как мой объект AuthComponent :: user () теперь содержит массив отделов.

Есть ли простой способ перебрать массив AuthComponent :: user () Department и проверить, совпадает ли значение с выбранным значением?

Старый вид кода перед HABTM отношения:

if (AuthComponent::user('admin') == 1 || (AuthComponent::user('department_id') == $department['Department']['id'])) {
// Some code here
};

Массив AuthComponent :: user ():

array(16) {
["id"]=>
string(1) "6"["salutation"]=>
string(2) "Mr"["firstname"]=>
string(6) "Joe"["lastname"]=>
string(4) "Bloggs"["email"]=>
string(21) "[email protected]"["role"]=>
string(23) "Teacher"["admin"]=>
bool(true)
["dos"]=>
bool(false)
["school_id"]=>
string(1) "1"["active"]=>
bool(true)
["School"]=>
array(2) {
["id"]=>
string(1) "1"["name"]=>
string(10) "School Name"}
["Department"]=>
array(3) {
[0]=>
array(2) {
["id"]=>
string(1) "4"["name"]=>
string(20) "Careers & University"}
[1]=>
array(2) {
["id"]=>
string(2) "14"["name"]=>
string(9) "Geography"}
[2]=>
array(2) {
["id"]=>
string(2) "16"["name"]=>
string(3) "ICT"}
}
}

2

Решение

Возможно, самый простой подход заключается в использовании CakePHP- Hash::extract() метод для создания простого массива всех отделов, принадлежащих пользователю, и затем проверка, существует ли отдел в этом массиве следующим образом:

$user = AuthComponent::user();
$departments = Hash::extract($user, 'Department.{n}.id');
if (
(int)$user['admin'] === 1
|| in_array($department['Department']['id'], $departments) === true
) {
// Some code here
}

Стоит взглянуть на утилиту Hash в CakePHP, так как она предоставляет несколько очень удобных методов манипулирования массивами, которые позволяют работать с массивами, возвращаемыми find() запросы.

2

Другие решения

Есть много разных способов сделать это. Вы могли бы просто написать функцию, которая проходит циклически и довольно просто для реализации:

function doesBelongToDepartment($deptList, $userDeptId)
{
foreach($deptList as $dept) {
if($dept['id'] == $userDeptId) return true;
}
return false;
}

И тогда вы можете использовать его следующим образом:

if (AuthComponent::user('admin') == 1 || doesBelongToDepartment($department['Department'], AuthComponent::user('department_id'))) {
0

По вопросам рекламы [email protected]