方法Illuminate\Database\Eloquent\Collection::books不存在.(拉拉威尔



我是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();。它应该返回MemberCollection

因此,当您尝试在由变量member保持的集合上调用books时,它不会成功,因为IlluminateSupportCollection类没有定义方法books,您必须使用foreach循环或Collection中的eachmap方法来循环遍历该集合。

$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([
//...
]);        
}

最新更新