使用resource在json响应中返回多个对象

omtl5h9j  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(257)

我对拉雷维尔有点陌生,希望有人能给我一些帮助。
我为我的英语道歉
因此,我正在尝试与一些朋友开发一个应用程序,以便在强制日期临近时发送警报来管理我们的食物。
我正在开发api,实际结构是这样的:
一个用户,
一种产品,
一个包含用户id,产品id,当然还有强制日期的篮子。
所以现在,当我调用在我的api上获取用户“stock”时,我希望可以得到如下结果:

{
  '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);
    }

我得到以下错误(这个)
说比产品。id戡篮不存在和它的权利,它不应该存在。这是一个有产品标识的篮子。所以我知道这是来自我声明的关系,但我不知道如何做对。
有人能来救我吗???
非常感谢,希望你能理解我!祝你今天愉快

ryevplcw

ryevplcw1#

当我看着你 Basket 模特儿,看来你得换个发型了:

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

收件人:

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

因为你有 product_id 在你的 baskets table。使用 hasOne() 关系,您需要删除 product_idbaskets 表和添加 basket_idproducts table,因为 hasOne() 关系就像 hasMany() ,仅呼叫 ->first() 而不是 ->get()

相关问题