Изменить массив результатов связки тортов

У меня проблема с изменением иерархии тортовых ассоциаций, я новичок в cakephp, ниже приведен фрагмент кода.

Текущий код

$this->Cateogory->find('all');

Вывод вышеприведенного выражения имеет следующую форму:

    [
{
"Category": {
"id": "37",
"title": "Inner Title",
"color": "#ffffff",
"phone-number": ""},
"CategoryHas": [],
"PhoneNumberhas": []
}
]

Требование: —

Я создаю API для стороннего потребления, теперь сторонний разработал формат вывода, как показано ниже. Я хочу, чтобы результат был ниже формы.

    [
{
"Category": {
"id": "37",
"title": "Inner Title",
"color": "#ffffff",
"phone-number": "",
"CategoryHas": [],
"PhoneNumberhas": []
}
}
]

Я ищу эту проблему в течение последних 1 дня и считаю, что мне нужно сделать пользовательскую функцию PHP для решения этой проблемы.

Заранее спасибо :

0

Решение

Просто используйте петлю

Чтобы преобразовать массив первого формата в массив второго формата — просто используйте цикл, например:

foreach ($stuff as &$row) {
$row['Category']['CategoryHas'] = $row['CategoryHas'];
$row['Category']['PhoneNumberhas'] = $row['PhoneNumberhas'];
unset($row['CategoryHas'], $row['PhoneNumberhas']);
}

Это было бы целесообразно установить в свой контроллер, если он нужен только в одном месте.

Если вы всегда хотите получать результаты в этом формате, используйте метод afterFind (или поведение) для реализации той же логики:

// In the category model
public function afterFind($results, $primary = false) {
foreach ($results as &$row) {
if (isset($row['CategoryHas'])) {
$row['Category']['CategoryHas'] = $row['CategoryHas'];
}
if (isset($row['PhoneNumberhas'])) {
$row['Category']['PhoneNumberhas'] = $row['PhoneNumberhas'];
}
unset($row['CategoryHas'], $row['PhoneNumberhas']);
}
return $results;
}

Будьте осторожны при выборе этой опции — это означает, что ваши модели работают нетрадиционно, потенциально это означает, что плагины не работают, а другие разработчики (или вы, завтра) смущены тем, как действуют модели.

0

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

Названия вашей ассоциации довольно странные. Почему они не названы лучше? Вы можете использовать собственные имена внутри и переформатировать его при отправке.

Если речь идет только о получении ответа API в глупый формат, который не дает дополнительных преимуществ, используйте представления JSON и при необходимости измените структуру массива в представлении. Этот раздел книги объясните это подробно, прочитайте это. Пример взят из книги:

// Controller code
class CategoriesController extends AppController {
public function index() {
// ... get the categories
$this->set(compact('categories'));
}
}

// View code - app/View/Posts/json/index.ctp
foreach ($categories &$row) {
if (isset($row['CategoryHas'])) {
$row['Category']['CategoryHas'] = $row['CategoryHas'];
}
if (isset($row['PhoneNumberhas'])) {
$row['Category']['PhoneNumberhas'] = $row['PhoneNumberhas'];
}
unset($row['CategoryHas'], $row['PhoneNumberhas']);
}
echo json_encode(compact('categories'));

Я бы убедил клиента и привел несколько аргументов для правильного формата и структуры ответа. Большинство клиентов обычно не знают, чего хотят. Иногда у вас есть умные задницы, которые думают, что им нужно что-то конкретное, но могут объяснить, почему. Проверьте JSend или же http://jsonapi.org/ о том, как реализовать правильный формат ответа API. Понять причины этих форматов и довести эти аргументы до клиента.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector