Почему метод first() работает, а get() - нет в контроллере?

Рейтинг: 0Ответов: 1Опубликовано: 25.05.2023

Столкнулась со следующей ошибкой.

"Property [id] does not exist on this collection instance."

Есть следующий контроллер

namespace App\Http\Controllers\API\App;
use App\Http\Resources\UserPredictablePeriodResource;
use App\Models\UserPredictablePeriod;
use App\Http\Controllers\API\BaseController as BaseController;

use Illuminate\Support\Facades\Auth;

class UserPredictablePeriodController extends BaseController
{
  /**
   * Display the specified resource.
   *
   * @param  int  $id
   * @return \Illuminate\Http\Response
   */
  public function show()
  {
    $user = Auth::user();
    $userPredictablePeriod = UserPredictablePeriod::where("user_id", $user->id)->get();
    if (is_null($userPredictablePeriod)) {
      return $this->sendError(`Predictable periods not found`);
    }

    return $this->sendResponse(new UserPredictablePeriodResource($userPredictablePeriod), 'Predictable periods retrieved successfully.');
  }
}

Есть следующая модель

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class UserPredictablePeriod extends Model
{
  use HasFactory;

  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable = [
    'user_id',
    'started_at',
    'finished_at',
    'days_last'
  ];
}

И следующий ресурс

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserPredictablePeriodResource extends JsonResource
{
  /**
   * Transform the resource into an array.
   *
   * @param  \Illuminate\Http\Request  $request
   * @return array
   */
  public function toArray($request)
  {
    return [
      'id' => $this->id,
      'user_id' => $this->user_id,
      'started_at' => $this->started_at,
      'finished_at' => $this->finished_at,
      'days_last' => $this->days_last,
      'created_at' => $this->created_at->format('d/m/Y'),
      'updated_at' => $this->updated_at->format('d/m/Y'),
    ];
  }
}

Однако, если вместо метода get() установить first(), то выдает первую запись того информационного массива, который мне и необходим. Каким образом можно решить данную задачу?

Ответы

▲ 2Принят

Метод get возвращает коллекцию моделей, соответственно, ресурс нужно создавать как UserPredictablePeriodResource::collection($userPredictablePeriod) (без new, это статический вызов метода)

https://laravel.com/docs/10.x/eloquent-resources#resource-collections