具有 laravel 关系的错误 sql 查询

wrong sql queries with laravel relation

这是我的 tables

Schema::create('badge_user', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
            $table->foreignId('badge_id')->references('id')->on('badges')->onUpdate('cascade')->onDelete('cascade');
            $table->timestamps();
            $table->softDeletes();
        });
Schema::create('badges', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('description')->nullable();
            $table->string('image')->nullable();
            $table->integer('condition');
            $table->timestamps();
            $table->softDeletes();
        });

这是关系 在 BagdeUser 模态

public function badge()
    {
        return $this->hasMany(Badge::class);

    }

在徽章模式中

 public function badgeUser()
    {
        return $this->belongsTo(BadgeUser::class , 'badge_id');

    }

在我的资源中

我已经从 badge_user table 中获取所有数据并将其传递到资源中

public function toArray($request)
    {
        return [
            'badges' => new BadgeResource($this->badge),
        ];
    }

BadeResource

public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'description' => $this->description,
            'image' => new MediaResource($this->getMedia('badge')->first()),
            'condition' => $this->condition,
        ];

在获取数据时得到了这个

Column not found: 1054 Unknown column 'badges.badge_user_id' in 'where clause' (SQL: select * from `badges` where `badges`.`badge_user_id` = 1 and `badges`.`badge_user_id` is not null and `badges`.`deleted_at` is null)

现在我希望徽章与用户相关联

问题是,在您的 badge_user 迁移中,您创建了外键 badge_id,这意味着存在关系 Badge User N:1 Badge

但是在您的模型中,您指定 BadgeUser 有很多徽章并且 Badge 属于 BadgeUser(即 Badge User 1:N Badge

这就是为什么 laravel 在查询中寻找 badge_user_id 的原因,因为您以相反的方式定义了关系。

你仍然可能在做 M:N 你不需要手动做的关系。

你应该使用这样的东西(来自 Laravel 文档)

return $this->belongsToMany(Role::class);