【问题标题】:Method Illuminate\Database\Query\Builder::purchases does not exist方法 Illuminate\Database\Query\Builder::purchases 不存在
【发布时间】:2023-03-23 03:10:02
【问题描述】:

我正在尝试跟踪此错误,但我不知道我需要在哪里创建购买。如果有人可以帮助我知道如何遵循此错误,我将不胜感激。

这是我的迁移

public function up()
{
    Schema::create('purchases', function (Blueprint $table) {
      $table->increments('id');
      $table->string('product');
      $table->string('fname');
      $table->string('lname');
      $table->string('address');
      $table->string('city');
      $table->string('state');
      $table->integer('zip');
      $table->string('card');
      $table->timestamps();
    });
}

这是我的模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Purchase extends Model
{
  public function addPurchase($body)
  {
    $this->purchases()->create(compact('fName'));
    $this->purchases()->create(compact('lName'));
    $this->purchases()->create(compact('address'));
    $this->purchases()->create(compact('city'));
    $this->purchases()->create(compact('state'));
    $this->purchases()->create(compact('zip'));
    $this->purchases()->create(compact('card'));
  }
}

编辑:我正在尝试将上述所有日期推送到 mySQL 数据库

这是我的控制器存储功能

public function store(Purchase $purchase)
{
   $this->validate(request(), ['fName' => 'required|min:3']);
   $this->validate(request(), ['lName' => 'required|min:3']);
   $this->validate(request(), ['address' => 'required']);
   $this->validate(request(), ['city' => 'required']);
   $this->validate(request(), ['state' => 'required']);
   $this->validate(request(), ['zip' => 'required']);
   $this->validate(request(), ['card' => 'required']);

   $purchase->addPurchase(request('fName'));
   $purchase->addPurchase(request('lName'));
   $purchase->addPurchase(request('address'));
   $purchase->addPurchase(request('city'));
   $purchase->addPurchase(request('state'));
   $purchase->addPurchase(request('zip'));
   $purchase->addPurchase(request('card'));

   return back();
}

【问题讨论】:

  • 期望的行为是什么?您收到错误是因为在模型Purchase 中您调用的是不存在的$this-&gt;purchases()。模型上没有方法purchases
  • $body 是一个包含所有表单值的数组,对吧?
  • @devk 我认为这就是这条线所做的。 Schema::create('purchases', function (Blueprint $table) { 它说 'purchases' 不是变量吗?
  • 不,它说方法purchases() 在查询生成器上不存在。模型上下文中的$this 将返回一个查询构建器,除非您实例化一个模型(使用类似Model::first() 的东西)。编辑您的问题并解释所需的行为是什么以及 $body 变量是什么,我们可以为您提供帮助。
  • 它在那里定义,但你在其他地方调用它。可能在控制器中。

标签: php laravel query-builder


【解决方案1】:

正如我们在 cmets 中建立的,错误发生是因为控制器中的 $purchase 变量是 Purchase 查询构建器的实例。在您的 -&gt;addPurchase() {...} 方法中,您调用的是 $this-&gt;purchase(),这是查询构建器上不存在的方法。

现在如何使这项工作。有很多方法。

一种方法是手动将所有属性分配给模型,然后调用-&gt;save()

public function store(Purchase $purchase)
{
    // ... validation

    // Assign the properties
    $purchase->fname = request('fName');
    $purchase->lname = request('lName');
    $purchase->address = request('address');
    $purchase->city = request('city');
    $purchase->state = request('state');
    $purchase->zip = request('zip');
    $purchase->card = request('card');
    $purchase->save(); // Save to the database

    return back();
}

另一个是使用mass assignment:

public function store(Purchase $purchase)
{
    // ... validation

    $purchase->forceCreate(request()->only([
        'fName', 'lName', 'address', 'city', 'state', 'zip', 'card',
    ]));

    return back();
}

使用forceCreate(...),它与-&gt;create(...) 相同,只是它绕过$fillable 数组,在这个特定实例中是可以的,因为a) 我们手动告诉它要填充哪些字段,使用request()-&gt;only([fields]) b) 您在保存前执行验证。

还有更多方法可以做到这一点,其中大多数是well documented

我建议的最后一件事是使用(技术上)1 行执行验证:

public function store(Purchase $purchase)
{      
    $this->validate(request(), [
        'fName' => 'required|min:3',
        'lName' => 'required|min:3',
        'address' => 'required',
        'city' => 'required',
        'zip' => 'required',
        'card' => 'required',
    ]);

    // Save the model...
}

这样你会得到一个数组中的所有错误(如果某些错误没有通过),而不仅仅是第一个没有通过的错误。

【讨论】:

  • 哦,感谢有关所有错误的提示,我想知道为什么我只收到“第一个”错误!
猜你喜欢
  • 2018-09-24
  • 2019-01-24
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
相关资源
最近更新 更多