Не могу вернуть элемент отношения в json Laravel - PullRequest
0 голосов
/ 06 ноября 2019

Я использую Laravel с ресурсами для создания REST Api. Я хотел бы получить json с информацией об элементе отношений, как в примере

{
"id": 30,
"calf": 23,
"chest": 27
"user_id": {
    "id": 30,
    "email": "test@example.com"
}}

Но когда я создал код, как в документации, я получил ошибку «Сначала вызов функции-члена () в int». Может кто-нибудь сказать мне, что я делаю не так? Я сделал то же самое, что и в документах, я пытался также использовать whenLoaded, но эту же ошибку. Это мой код:

 class CircuitMeasurementResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
//        return parent::toArray($request);
        return [
            'id' => $this->id,
            'calf' => $this->calf,
            'chest' => $this->chest,
            'user_id' => UserResource::collection($this->user_id)
        ];
    }
}

Мой метод отображения в контроллере:

public function show(CircuitMeasurement $circuitMeasurement): CircuitMeasurementResource {
        return new CircuitMeasurementResource($circuitMeasurement);
    }

Мои модели:

    class CircuitMeasurement extends Model
{
    protected $fillable = [
        'user_id', 'calf', 'thigh', 'hips', 'waist', 'chest', 'neck', 'biceps'
    ];
    public function users(){
        return $this->belongsTo(User::class);
    }
}

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */

    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function weightMeasurement(){
        return $this->hasMany(WeightMeasurement::class);
    }
    public function circuitMeasurement(){
        return $this->hasMany(CircuitMeasurement::class);
    }

}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Вам вообще не нужно использовать UserResource, просто найдите пользователя по этому идентификатору

public function toArray($request)
{
    return [
        'id' => $this->id,
        'calf' => $this->calf,
        'chest' => $this->chest,
        'user_id' => User::find($this->user_id),
    ];
}

Результат

{
    "data": {
        "id": 30,
        "calf": 23,
        "chest": 27,
        "user_id": {
            "id": 30,
            "name": "Charity Douglas",
            "email": "demmerich@example.org",
            "email_verified_at": "2019-11-06 11:25:07",
            "created_at": "2019-11-06 11:25:07",
            "updated_at": "2019-11-06 11:25:07"
        }
    }
}

Надеюсь, это поможет

0 голосов
/ 06 ноября 2019

В вашем коде несколько ошибок:

  1. В вашем CircuitMeasurement измените на:
// since it gets just one
    public function user(){
        return $this->belongsTo(User::class);
    }
Вы используете ResourceName::collection() для нескольких элементов и new ResourceName() для одного элемента. Измените свой ресурс на:
public function toArray($request)
    {
//        return parent::toArray($request);
        return [
            'id' => $this->id,
            'calf' => $this->calf,
            'chest' => $this->chest,
            'user_id' => new UserResource($this->user)
           //I think you should name user instead of user_id
        ];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...