【问题标题】:Method Illuminate\Database\Eloquent\Collection::books does not exist.(laravel)方法 Illuminate\Database\Eloquent\Collection::books 不存在。(laravel)
【发布时间】:2021-03-26 20:09:09
【问题描述】:

我是laravel的初学者,我想将一本书存储到books数据库,但是点击按钮后,它显示“Method 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');
}

books.create

<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>

User 和 Member 是一对一的关系,Book 属于一个 Member

图书模型

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();
    });
}

【问题讨论】:

  • 欢迎SO ...auth()-&gt;user()-&gt;member()-&gt;create()直接这样使用不要保存在变量中

标签: php laravel


【解决方案1】:

您正在从这个调用链接收一个集合:

$member = auth()->user()->member()->get();

get 在关系方法上调用时将始终返回一个集合。如果你想要一个模型,你可以打电话给first

$member = auth()->user()->member()->first();

虽然first 可以返回null,所以你可能需要检查一下。

访问此关系结果的另一种方法是使用关系member 的动态属性:

$member = auth()->user()->member;

由于该关系被定义为HasOne,它知道为单个结果加载它或null

假设此时$member 不是null,您应该可以接受其余的情况。

【讨论】:

    【解决方案2】:

    $member=auth()-&gt;user()-&gt;member()-&gt;get(); 返回一个集合而不是 Member 类的对象。使用$member=auth()-&gt;user()-&gt;member()-&gt;first();$member=auth()-&gt;user()-&gt;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');
    }
    

    【讨论】:

      【解决方案3】:

      该错误是由于此调用 $member=auth()-&gt;user()-&gt;member()-&gt;get();.它应该返回 CollectionMember

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

      $member->each(function($member){
          $member->books()->create([
              //
          ]);
      });
      

      或者您是否已经在User 模型中定义user 将始终使用hasOne 方法拥有一个成员。

      所以你可以使用auth()-&gt;user()-&gt;member()-&gt;first();,它返回一个Member类型的实例,你可以在上面调用books方法,但是你必须确保Authenticated use已经有一个附加到他的成员避免任何错误。即使是这种情况,您也可以随时使用 if 语句检查变量 $member 是否不为空

      $member = auth()->user()->member()->first();
      if($member){
          // here you can have access to `books`
          $member->books()->create([
              //...
          ]);        
      }
      

      【讨论】:

      • 感谢您的解释!我明白了:),我解决了这个问题!这是我在这里的第一个问题,我学到了很多,谢谢大家!
      猜你喜欢
      • 1970-01-01
      • 2021-05-30
      • 2020-03-25
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2021-09-08
      相关资源
      最近更新 更多