使用资源

时间:2018-12-13 22:10:07

标签: php mysql laravel eloquent resources

我是Laravel的新手,希望有人能给我一些帮助。

我为我的英语道歉

因此,我正在尝试与一些朋友一起开发应用程序,以在许可日期临近时发送警报来管理我们的食物。

我正在开发API,实际的结构是这样的:

用户

一种产品

包含用户ID,产品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);
    }

我收到以下错误(this one)

说比products.id_basket不存在,它的权利不应该存在。这是一个有product_id的购物篮。所以我知道这来自我声明的关系,但是我不知道该怎么做。

有人可以救我吗?

非常感谢,希望您能理解我! 祝你有美好的一天

1 个答案:

答案 0 :(得分:0)

当我查看您的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()