对 null 调用成员函数 getRelationExistenceQuery()

Agu*_*nel 5 laravel

当我尝试运行种子时出现错误。

这是错误:

在供应商/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php:49 45| $method = $this->canUseExistsForExistenceCheck($operator, $count) 46| ?'getRelationExistenceQuery' 47 | : 'getRelationExistenceCountQuery'; 48|

49| $hasQuery = $relation->{$method}( 50| $relation->getRelated()->newQueryWithoutRelationships(), $this 51| ); 52| 53| // 接下来我们将调用任何给定的回调作为“匿名”范围,以便他们可以获得

  +3 vendor frames
Run Code Online (Sandbox Code Playgroud)

4 数据库/工厂/UserFactory.php:59 Illuminate\Database\Eloquent\Model::__callStatic()

  +6 vendor frames
Run Code Online (Sandbox Code Playgroud)

11 [内部]:0 Illuminate\Database\Eloquent\FactoryBuilder::Illuminate\Database\Eloquent{closure}()

这是工厂:

use App\User;
use App\Category;
use App\Product;
use App\Transaction;
use App\Seller;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(User::class, function (Faker $faker) {
    static $password;
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => Str::random(10),
        'verified' => $verificado = $faker->randomElement([User::USUARIO_VERIFICADO, User::USUARIO_NO_VERIFICADO]),
        'verification_token'=> $verificado == User::USUARIO_VERIFICADO ? null : User::generarVerificationToken(),
        'admin' => $faker->randomElement([User::USUARIO_ADMINISTRADOR, User::USUARIO_REGULAR]),
    ];
});

$factory->define(Category::class, function (Faker $faker) {
    return [
        'name' => $faker->word,
        'description'=> $faker->paragraph(1),
    ];
});

$factory->define(Product::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'description'=> $faker->paragraph(1),
        'quantity'=> $faker->numberBetween(1, 10),
        'status'=> $faker->randomElement([Product::PRODUCTO_DISPONIBLE, Product::PRODUCTO_NO_DISPONIBLE]),
        'image'=> $faker->randomElement(['1.jgp', '2.jgp', '3.jgp']),
        'seller_id'=> User::all()->random()->id,
    ];
});


$factory->define(Transaction::class, function (Faker $faker) {
    
    $vendedores= Seller::has('products')->get()->random();
    $comprador= User::all()->except($vendedores->id)->random();
    return [
        'quantity'=> $faker->numberBetween(1, 3),
        'buyer_id'=> $comprador->id,
        'product_id'=> $vendedores->products->random()->id,
    ];
});
Run Code Online (Sandbox Code Playgroud)

这是种子:

use Illuminate\Database\Seeder;
use App\User;
use App\Category;
use App\Product;
use App\Transaction;

public function run()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS = 0');
        User::truncate();
        Product::truncate();
        Category::truncate();
        Transaction::truncate();
        DB::table('category_product')->truncate();

        $cantidadusuarios= 200;
        $cantidadcategorias= 30;
        $cantidadproductos= 1000;
        $cantidadtransacciones= 1000;

        factory(User:: class, $cantidadusuarios)->create();
        factory(Category:: class, $cantidadcategorias)->create();
        factory(Product:: class, $cantidadtransacciones)->create()->each(
            function($producto)
            {
                $categorias= Category::all()->random(mt_rand(1, 5))->pluck('id');
                $producto->categories()->attach($categorias->first());
            }
        );
        factory(Transaction:: class, $cantidadtransacciones)->create();

    }
Run Code Online (Sandbox Code Playgroud)

Hea*_*man 25

就我而言,因为我显然不是很聪明,所以我得到了这个错误,因为在我的关系函数中我刚刚做了$this->belongsTo(TheModel::class);并且忘记了实际返回它。


小智 2

我认为我们正在 Udemy 上做同样的课程。我遇到了这个问题,在我的例子中,问题出在卖方模型中,实际上,当某些模型关系与数据库级别(在您的迁移中)不同时,就会出现此问题。因此,请检查卖家型号并确保您有

public function products() {
    return $this->hasMany(Product::class);
}
Run Code Online (Sandbox Code Playgroud)

里面还有其他模型。