Как я могу выбрать некоторые столбцы отношения в модели ресурсов?

#php #laravel #eloquent #laravel-8

#php #laravel #красноречивый #laravel-8

Вопрос:

У меня есть ресурс модели, и я вызываю $this-> теги внутри него

Этот ресурс возвращается следующим образом:

 "data": {
  "some_keys"  : ...,
  "some_keys2" : ...,
  "tags":[
           {
             "id": 1,
             "name": "c  ",
             "parent_id": null,
             "type": null,
             "created_at": "2020-09-27 20:37:57",
             "updated_at": "2020-09-27 20:37:57",
             "pivot": {
                "task_id": 43,
                "skill_id": 1
             }
           }
        ]
  

Я хочу сделать следующее:

 "data": {
  "some_keys"  : ...,
  "some_keys2" : ...,
  "tags": [
            {
              "id": 1,
              "name": "c  "
            }
          ]
  

Моя модель ресурсов:

 public function toArray($request)
{
    $data = parent::toArray($request);
    $data["tags"] = $this->tags;
    return $data;
}
  

Моя модель задачи:

 public function tags(){
    return $this->belongsToMany(Skill::class, 'task_skills', 'task_id', 'skill_id');
}
  

Как я могу уменьшить некоторые столбцы тегов в модели ресурсов?

Я решил это так:

 $data["tags"] = $this->tags->makeHidden(['pivot','created_at','updated_at','type','parent_id']);
  

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

1. Если мой ответ не решит вашу проблему, пожалуйста, сообщите мне больше о вашей проблеме, чтобы я мог вам помочь.

2. @PrafullaKumarSahu Я пробовал «только» и «получить», ни один из них не решил мою проблему. Когда я использовал ‘only’, он возвращает пустой массив. И для get он возвращает null . Также я не хотел использовать ‘pluck’

3. Итак, вам нужны только теги, а внутри тегов также нужны только id и name?

4. @PrafullaKumarSahu Не только теги, я просто фильтрую только теги, которые возвращают идентификатор и имя. Это та часть, которую мне нужно исправить, что $this-> теги

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

Ответ №1:

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

вырвать

 $collection = collect([
    [
        'speakers' => [
            'first_day' => ['Rosa', 'Judith'],
            'second_day' => ['Angela', 'Kathleen'],
        ],
    ],
]);

$plucked = $collection->pluck('speakers.first_day');

$plucked->all();

// ['Rosa', 'Judith']
  

Только

 $collection = collect(['product_id' => 1, 'name' => 'Desk', 'price' => 100, 'discount' => false]);

$filtered = $collection->only(['product_id', 'name']);

$filtered->all();

// ['product_id' => 1, 'name' => 'Desk']
  

получить

 $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);

$value = $collection->get('name');

// Taylor
  

Если вы всегда хотите, чтобы некоторые атрибуты были скрыты, вы можете использовать

protected $hidden = ['parent_id', 'created_at']; в вашей модели

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

1. Вызов неопределенного метода IlluminateDatabaseEloquentRelationsbelongsToMany::all()

2. @Furkanozturk можете ли вы вставить копию своей коллекции в свой вопрос или суть и поделиться со мной?

3. Я решил, используя makeHidden для других столбцов. Спасибо за ваши усилия

4. @Furkanozturk хорошо.