Cakephp 4.2 Связанный массив данных с полем в качестве ключа

#cakephp #associations #has-and-belongs-to-many

Вопрос:

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

У меня есть таблица products , которая имеет множество, attributes которая имеет множество attributetypes . Это attributetypes определяет технические особенности моего attributes . Мое главное замечание здесь-это поле attributetypes.slug , которое является уникальным полем, поэтому его можно использовать в качестве идентификатора.

В моей функции экспорта я хочу сделать что-то вроде этого:

 foreach ($poducts as $product) {
  $export_array = [
    ... 
    'width' => $product->attributes['slug-width']->value,
    ..
  ];
}
 

Откуда slug-widht взялся этот слизняк Attributes.Attributetypes.slug

в настоящее время я работаю с отдельными циклами foreach, но мне интересно, есть ли встроенные механизмы для того, чего я планирую достичь, или я мог бы создать такой механизм в своей модели или где-то еще?

Я бы предпочел решение, подобное .. ->find('list', ... тому, в котором я могу определить поля ключей и значений — в этом примере мне понадобятся все Products.Attributes доступные объекты Products.Attributes.Attributetypes.slug .

заранее спасибо

*редактировать, как упоминал @ndm, похоже, что мой вопрос довольно абстрактен. Так что я показываю, на что я способен:

Когда я позвоню

 $products = $this->Products->find('All', [
  'contain' => [
    'Attributes.Attributestypes',
    ...
  ]
);
 

мои продукты выглядят примерно так:

 object(AppModelEntityProduct)#330 (22) {
  ["id"] => int(1)
  ["article_number"] => string(6) "100575"
  ...
  
  ["attributes"]=> array(8) {
    [0]=> object(AppModelEntityAttribute)#244 (16) {
      ["id"]=> int(1)
      ["attributetype_id"]=> int(1)
      ["product_id"]=> int(1)
      ["value"]=> string(1) "0"
      ...
      ["attributetype"]=> object(AppModelEntityAttributetype)#243 (15) {
        ["id"]=> int(1)
        ["slug"]=> string(6) "weight"
        ["datatype"]=> string(5) "float"
        ["name"]=> string(7) "Gewicht"
        ...
      }
      ...
    }
    [1]=> object(AppModelEntityAttribute)#238 (16) {
      ["id"]=> int(2)
      ["attributetype_id"]=> int(2)
      ["product_id"]=> int(1)
      ["value"]=> string(1) "0"
      ...
      ["attributetype"]=> object(AppModelEntityAttributetype)#234 (15) {
        ["id"]=> int(2)
        ["slug"]=> string(6) "length"
        ["datatype"]=> string(5) "float"
        ["name"]=> string(6) "Länge"
        ...
      }
      ...
    }
    ...
  }
  ...
}
 

Но было бы здорово, если бы это выглядело так:

 object(AppModelEntityProduct)#330 (22) {
  ["id"] => int(1)
  ["article_number"] => string(6) "100575"
  ...
  
  ["attributes"]=> array(8) {
    ["**weight**"]=> object(AppModelEntityAttribute)#244 (16) {
      ["id"]=> int(1)
      ["attributetype_id"]=> int(1)
      ["product_id"]=> int(1)
      ["value"]=> string(1) "0"
      ...
      ["attributetype"]=> object(AppModelEntityAttributetype)#243 (15) {
        ["id"]=> int(1)
        ["slug"]=> string(6) "**weight**"
        ["datatype"]=> string(5) "float"
        ["name"]=> string(7) "Gewicht"
        ...
      }
      ...
    }
    ["**length**"]=> object(AppModelEntityAttribute)#238 (16) {
      ["id"]=> int(2)
      ["attributetype_id"]=> int(2)
      ["product_id"]=> int(1)
      ["value"]=> string(1) "0"
      ...
      ["attributetype"]=> object(AppModelEntityAttributetype)#234 (15) {
        ["id"]=> int(2)
        ["slug"]=> string(6) "**length**"
        ["datatype"]=> string(5) "float"
        ["name"]=> string(6) "Länge"
        ...
      }
      ...
    }
    ...
  }
  ...
}
 

Я надеюсь, что это немного прояснит ситуацию

Комментарии:

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