我是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的购物篮。所以我知道这来自我声明的关系,但是我不知道该怎么做。
有人可以救我吗?
非常感谢,希望您能理解我! 祝你有美好的一天
答案 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()