Объединить имущество со значением на Laravel - PullRequest
0 голосов
/ 24 января 2019

В проекте у меня есть одна таблица:

item_attributes(
    id,
    property varchar, // year for example
    type varchar,
    value varchar, // 1999 for example
)

В Laravel я хочу объединить свойство и значение, поэтому при выборе элемента ответ должен быть

year => 1999

Когда я выбираю элемент с атрибутами, ответ будет таким: enter image description here

Item::with("attributes")->get()

Ответы [ 4 ]

0 голосов
/ 24 января 2019

В классе модели элементов определите метод, например:

// Assumed that an item "hasMany" attributes:
function getItemAttributesAttribute() {
    $attr = [];
    foreach($this->attributes as $attribute) {
      $attr[$attribute->property] = $attribute->value;
    }
    return $attr;
}

И используйте его в вашем контроллере как:

dd(Item::get()->first()->item_attributes);
// or
dd(Item::find(1)->item_attributes);

Если вы хотите получить несколько элементов с атрибутами:

$list = [];
foreach(Item::get() as $item) {
    $list[$item->id] = $item->item_attributes; 
}
dd($list);
0 голосов
/ 24 января 2019

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

public function getPropertyValueAttribute()
{
   return "{$this->property} => {$this->value}";
}
0 голосов
/ 24 января 2019

Я думаю pluck() должно работать.

Item::with("attributes")
    ->get()
    ->pluck('attributes.value', 'attributes.property'); 
0 голосов
/ 24 января 2019

Чтобы иметь возможность вернуть пользовательский json data при возврате одной или нескольких моделей одного типа, вы можете использовать Resources, который является просто еще одним уровнем, отвечающим за преобразование данных, которые вы хотите вернуть из вашего приложения, поскольку вопрос не является конкретным, я дам вам ссылку, где вы можете проверить больше об этом: https://laravel.com/docs/5.7/eloquent-resources#generating-resources

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...