Вернуть много объектов в моем ответе json, используя ресурс - PullRequest
0 голосов
/ 14 декабря 2018

Я вроде как новичок в Laravel и надеюсь, что кто-нибудь сможет мне помочь.

Я прошу прощения за мой английский

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

Я разрабатываю API, фактическая структура выглядит следующим образом:

Пользователь,

Продукт,

Корзина, содержащая идентификатор пользователя,product_id и, конечно, дата отмены.

Так что теперь, когда я звоню, чтобы получить пользовательский «запас» на моем API, я хотел бы получить что-то вроде этого:

{
  'id' : 1,
  'peremption_date': XX-XX-XX,
  'product' : {
           'id' : 3,
           'name': bblablabala,
           'brand' : blablabala
  },
  'id' : 2,
  'peremption_date': XX-XX-XX,
  'product' : {
           'id' : 4,
           'name': bblablabala,
           'brand' : blablabala
  },
}

Поэтому я взглянул на ресурсы и увидел, что, если я определю правильные отношения, это может помочь моему выводу.

Я свяжу с вами мои фактические объявления классов и их ресурсы:

Пользователь:

//user.php
class User extends Authenticatable
{
    use Notifiable, HasApiTokens;

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

    public function baskets()
    {
        return $this->hasMany(Basket::class);
    }
}

Продукт:

//Product.php

class Product extends Model
{
    protected $table = 'products';

    protected $fillable = ['code_barre', 'product_name', 'generic_name', 'brand', 'quantity'];

    public function basket()
    {
        return $this->belongsToMany(Basket::class);
    }
}

//productResource.php
class ProductResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'code_barre' => $this->code_barre,
            'product_name' => $this->product_name,
            'generic_name' => $this->generic_name,
            'brand' => $this->brand,
            'quantity' => $this->quantity,
            'created_at' => (string) $this->created_at,
            'updated_at' => (string) $this->updated_at,
        ];
    }
}

Корзина:

//Basket.php
class Basket extends Model
{
    protected $table = 'baskets';
    protected $fillable = ['user_id', 'product_id', 'dlc_date'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function product()
    {
        return $this->hasOne(Product::class);
    }
}

//BasketResource.php

class BasketResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'dlc_date' => (string) $this->dlc_date,
            'created_at' => (string) $this->created_at,
            'updated_at' => (string) $this->updated_at,
            'product' => $this->product
        ];
    }
}

Поэтому, когда я пытаюсь сохранить новую корзину в моем магазине, метод:

//BasketController.php
 public function store(Request $request)
    {
        $this->product->storeProduct($request->input('code_barre'));
        $att = DB::table('products')
            ->where('code_barre', '=', $request->input('code_barre'))
            ->first();
        $basket = Basket::create([
            'user_id' => $request->user()->id,
            'product_id' => $att->id,
            'dlc_date' => $request->input('dlc_date')
        ]);
        return new BasketResource($basket);
    }

Я получаю следующую ошибку (эта)

о том, что products.id_basket не существует и его право не должно существовать.Это корзина, у которой есть product_id.поэтому я знаю, что это происходит из-за отношений, которые я объявил, но я не могу понять, как это сделать правильно.

Может кто-нибудь прийти и спасти меня ???

Спасибо большое, я надеюсьты меня понял !Желаю тебе хорошего дня

1 Ответ

0 голосов
/ 14 декабря 2018

Когда я смотрю на вашу Basket модель, кажется, вам нужно изменить:

public function product()
{
    return $this->hasOne(Product::class);
}

на:

public function product()
{
    return $this->belongsTo(Product::class);
}

, потому что у вас есть product_id в вашем baskets стол.Чтобы использовать отношение hasOne(), вам нужно удалить product_id из таблицы baskets и добавить basket_id в таблицу products, потому что отношение hasOne() похоже на hasMany(), вызывая только ->first() вместо->get()

...