我是laravel的初学者,我想存储一个书到书的数据库,但点击按钮后,它显示"方法Illuminate\Database\Eloquent\Collection::books不存在"我错过了什么?这是我的密码。
BookController
public function create()
{
return view('books.create');
}
public function store(Request $request)
{
$this->validate($request, [
'book' => 'required|max:255',
'category' => 'required',
'quantity' => 'required|numeric',
'price'=>'required|numeric',
'info'=>'required'
]);
//$request->user()->member()->books()->create([
$member=auth()->user()->member()->get();
$member->books()->create([
'book' => $request->book,
'category' => $request->category,
'quantity' => $request->quantity,
'price'=>$request->price,
'info'=>$request->info
]);
return redirect('shops')->with('success', 'successful');
}
书籍。创建
<form action="{{route('books.store')}}" method="POST" role="form">
@csrf
@method('POST')
<div class="form-group">
<label for="book">name:</label>
<input id="book" name="book" class="form-control" placeholder="enter book name">
</div>
<div class="form-group">
<label for="category">category:</label>
<input id="category" name="category" class="form-control" placeholder="enter category">
</div>
<div class="form-group">
<label for="quantity">quantity:</label>
<input id="quantity" name="quantity" class="form-control" placeholder="enter quantity">
</div>
<div class="form-group">
<label for="price">price:</label>
<input id="price" name="price" class="form-control" placeholder="enter price">
</div>
<div class="form-group">
<label for="info">info:</label>
<textarea id="info" name="info" class="form-control" rows="10" placeholder="enter info"></textarea>
</div>
<button type="submit" class="btn-sm btn-primary">create</button>
</form>
用户和会员是一对一的关系,Book属于一个会员
图书型号
public function member()
{
return $this->belongsTo(Member::class);
}
protected $fillable = ['book','category','quantity','price','info'];
会员模型
public function books()
{
return $this->hasMany(Book::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
用户模型
public function member()
{
return $this->hasOne(Member::class);
}
书籍、用户和会员迁移
书籍迁移
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('member_id');
$table->foreign('member_id')->references('id')->on('members')->onDelete('cascade');
$table->string('name');
$table->integer('quantity');
$table->integer('price');
$table->string('path');
$table->string('info');
$table->string('category');
$table->timestamps();
});
}
成员迁移
public function up()
{
Schema::create('members', function (Blueprint $table) {
$table->increments('id');
$table->unsignedbigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('sex');
$table->string('email');
$table->string('address');
$table->string('tel');
$table->timestamps();
});
}
用户迁移
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->foreignId('current_team_id')->nullable();
$table->text('profile_photo_path')->nullable();
$table->timestamps();
});
}
您正在接收来自以下调用链的集合:
$member = auth()->user()->member()->get();
当对关系方法调用时,get
将始终返回一个Collection。如果你想要一个单一的模型,你可以调用first
:
$member = auth()->user()->member()->first();
虽然first
可能会返回null
,所以您可能需要检查一下。
访问该关系的结果的另一种方法是使用关系member
:的动态属性
$member = auth()->user()->member;
由于该关系被定义为HasOne
,所以它知道为单个结果或null
加载它。
假设$member
在这一点上不是null
,那么你应该可以接受其他的情况
$member=auth()->user()->member()->get();
返回一个集合,而不是Member类的对象。使用$member=auth()->user()->member()->first();
或$member=auth()->user()->member;
试试这个
public function store(Request $request)
{
$this->validate($request, [
'book' => 'required|max:255',
'category' => 'required',
'quantity' => 'required|numeric',
'price'=>'required|numeric',
'info'=>'required'
]);
$member=auth()->user()->member;
if($member){
$member->books()->create([
'book' => $request->book,
'category' => $request->category,
'quantity' => $request->quantity,
'price'=>$request->price,
'info'=>$request->info
]);
return redirect('shops')->with('success', 'successful');
}
//Member is not found, return with error
return redirect()->back()->with('error', 'Member not found');
}
该错误是由于此调用$member=auth()->user()->member()->get();
。它应该返回Member
的Collection
。
因此,当您尝试在由变量member
保持的集合上调用books
时,它不会成功,因为IlluminateSupportCollection
类没有定义方法books
,您必须使用foreach
循环或Collection
中的each
或map
方法来循环遍历该集合。
$member->each(function($member){
$member->books()->create([
//
]);
});
或者您已经在User
模型中使用hasOne
方法定义了user
将始终有一个成员吗。
因此,您可以使用auth()->user()->member()->first();
,它返回类型为Member
的单个实例,您在该实例上调用books
方法,但您必须确保Authenticated use已经有一个成员附加到他身上,以避免任何错误。即使是这种情况,您也可以使用if
语句检查变量$member
是否不为空
$member = auth()->user()->member()->first();
if($member){
// here you can have access to `books`
$member->books()->create([
//...
]);
}