@ganjo888

Как вывести только нужные поля relations?

Есть такой запрос где я получаю операции
$operation = Operation::with('tasks')->whereIn('name', ["whitelistedUri.view", 'user.view'])->get();
Получаю
{
      "id": 201,
      "name": "user.view",
      "sso_id": 6,
      "tasks": [
        {
          "id": 2,
          "pivot": {
            "operation_id": 201,
            "task_id": 2
          }
        }
      ]
    },
    {
      "id": 306,
      "name": "whitelistedUri.view",
      "sso_id": 7,
      "tasks": [
        {
          "id": 1,
          "pivot": {
            "operation_id": 306,
            "task_id": 1
          }
        },
        {
          "id": 2,
          "pivot": {
            "operation_id": 306,
            "task_id": 2
          }
        }
      ]
    }

Как я могу получить только айдишники поля tasks? тоесть (1 и 2), остальные поля мне не нужны
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
with(['tasks' => function ($query) {
  $query->select('id');
}])

https://laravel.com/docs/8.x/eloquent-relationship...
Ответ написан
codeturn
@codeturn
With('tasks:id')
На сколько помню изначально pivot не добавляется, а чтобы они были надо добавить withPivot.
Ещё можно в модели добавить pivot в hidden.
И да, если вы отдаете это по api, то лучше сразу разобраться с api resource, там будет полный контроль над тем, что отдавать клиенту.
Ответ написан
kimono
@kimono
Web developer
Используйте https://laravel.com/docs/7.x/eloquent-resources. Они как раз упрощают такую работу, и контроллер остаётся чистым:

class OperationController {
    public function all()
    {
        $operations = Operation::query()
            ->whereIn('name', ["whitelistedUri.view", 'user.view'])
            ->with('tasks')->get();

        return new OperationCollection($operations);
    }
}


class OperationCollection extends ResourceCollection
{
    public $collects = OperationResource::class;

    public function toArray($request)
    {
        return parent::toArray($request);
    }
}


class OperationResource extends JsonResource
{
    /**
     * @var Operation
     */
    public $resource;

    public function toArray($request)
    {
        return [
            'id' => $this->resource->id,
            'name' => $this->resource->name,
            'sso_id' => $this->resource->sso_id,
            'tasks' => $this->resource->tasks->pluck('id'),
        ];
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы