在我的laravel应用程序中,我发现了下面的错误,我认为这是因为这种关系形成的不正确?
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select * from `badges` where exists (select * from `users` inner join `user_badge` on `users`.`id` = `user_badge`.`user_id` where `badges`.`id` = `user_badge`.`badge_id` and `id` = 1) and `badgecategory_id` = 4 limit 1)\
方法触发错误。
public function syncBadges(Request $request)
{
$user = User::with('badges')->findOrFail($request['user_id']);
$badge = Badge::whereHas('users', function ($query) use ($request){
$query->where('id' , $request['user_id']);
})
->where('badgecategory_id',$request['badgecategory_id'])
->first();
if($badge)
{
$user->badges()->dettach($badge['id']);
$user->badges()->attach($request['badge_id']);
}
else
{
$user->badges()->attach($request['badge_id']);
}
}
用户模型:
public function badges()
{
return $this->belongsToMany('App\Models\Badge', 'user_badge', 'user_id', 'badge_id');
}
徽章模型:
protected $table = 'badges';
public function users()
{
return $this->belongsToMany('App\Models\User', 'user_badge', 'badge_id', 'user_id');
}
public function category()
{
return $this->belongsTo('App\Models\BadgeCategory', 'badgecategory_id');
}
Bage表偏移
public function up()
{
Schema::create('badges', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('badgecategory_id')->index();
$table->foreign('badgecategory_id')->references('id')->on('badgecategories')->onDelete('cascade')->onUpdate('cascade');
$table->string('title');
$table->string('icon')->nullable();
$table->timestamps();
});
}
用户徽章数据透视表迁移
class CreateUserBadgeTable extends Migration
{
public function up()
{
Schema::create('user_badge', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id')->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->unsignedInteger('badge_id')->nullable()->index();
$table->foreign('badge_id')->references('id')->on('badges')->onDelete('cascade')->onUpdate('cascade');
$table->timestamps();
});
}
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('user_badge');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
}
发布于 2022-08-17 22:10:36
在您的徽章查询中,您需要指定表,因为您使用的是whereHas
$badge = Badge::whereHas('users', function ($query) use ($request){
$query->where('users.id' , $request['user_id']);
})
->where('badgecategory_id',$request['badgecategory_id'])
->first();
https://stackoverflow.com/questions/73395169
复制相似问题