Laravel图书租赁问题:已租用户重复租赁限制失效排查
图书租赁项目租赁限制逻辑排查
我正在开发基于PHP Laravel的图书租赁项目,需求为登录用户仅可同时租赁一本图书。目前尝试限制用户租赁其他图书,但逻辑未生效,请求排查错误。相关代码及表结构如下:
1. 租书功能代码
public $user_id; public $kitap_id; public $AlimTarihi; public $TeslimTarihi; public $durum; public function kirala($kitap_id) { if(Auth::check()) { if(Kira::where('user_id',Auth::user()->id)->where('durum',"Edilmedi")) { session()->flash('message','您已有一本正在租赁的图书。'); return redirect('/user/dashboard'); } else { $kira = new Kira(); $kira->user_id = Auth::user()->id; $kira->kitap_id = $kitap_id; $kira->AlimTarihi = Carbon::now(); $kira->TeslimTarihi = Carbon::now()->addDays(7); $kira->durum = 'Edilmedi'; $kitaplar = Kitaplar::find($kitap_id); $kitaplar->kiraliMi = 1; $kitaplar->save(); $kira->save(); session()->flash('message','图书租赁成功。'); return redirect('/user/dashboard'); } } else { return redirect()->route('login'); } }
2. 租赁表(kiras)结构
Schema::create('kiras', function (Blueprint $table) { $table->id(); $table->bigInteger('user_id')->unsigned()->nullable(); $table->bigInteger('kitap_id')->unsigned()->nullable(); $table->timestamp('AlimTarihi')->nullable(); $table->timestamp('TeslimTarihi')->nullable(); $table->enum('durum',['Edildi','Edilmedi'])->default('Edilmedi'); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('kitap_id')->references('id')->on('kitaplars')->onDelete('cascade'); });
3. 图书表(kitaplars)结构
Schema::create('kitaplars', function (Blueprint $table) { $table->id(); $table->string('KitapAdi'); $table->BigInteger('BarkodNo'); $table->BigInteger('SayfaSayisi'); $table->decimal('SatisFiyati')->nullable(); $table->string('image')->nullable(); $table->text('images')->nullable(); $table->bigInteger('kategori_id')->unsigned()->nullable(); $table->bigInteger('yazar_id')->unsigned()->nullable(); $table->boolean('kiraliMi'); $table->timestamps(); $table->foreign('kategori_id')->references('id')->on('kategoris')->onDelete('cascade'); $table->foreign('yazar_id')->references('id')->on('yazarlars')->onDelete('cascade'); });
4. 用户表(users)结构
Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('lastName')->nullable(); $table->BigInteger('Yasi')->nullable(); $table->string('Adres')->nullable(); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->foreignId('current_team_id')->nullable(); $table->string('profile_photo_path', 2048)->nullable(); $table->string('utype')->default('USR')->comment('ADM for Admin and USR for User or Customer'); $table->timestamps(); });
错误排查与修复
核心问题出在租赁判断的if条件上:
// 原错误代码 if(Kira::where('user_id',Auth::user()->id)->where('durum',"Edilmedi"))
Eloquent的where()方法返回的是Illuminate\Database\Eloquent\Builder查询构造器实例,而非布尔值。在PHP中,对象会被视为true,因此无论用户是否存在未归还的图书,这个条件都会成立,导致逻辑混乱(要么永远无法租书,要么限制逻辑完全不生效)。
修复方案:使用exists()方法判断是否存在符合条件的记录,修改后的条件如下:
if(Kira::where('user_id', Auth::user()->id)->where('durum', 'Edilmedi')->exists())
或者用count()判断记录数是否大于0:
if(Kira::where('user_id', Auth::user()->id)->where('durum', 'Edilmedi')->count() > 0)
另外,建议补充以下优化点:
- 对
Kitaplar::find($kitap_id)添加空值判断,避免图书不存在时抛出错误:
$kitaplar = Kitaplar::find($kitap_id); if(!$kitaplar) { session()->flash('message','指定图书不存在。'); return redirect('/user/dashboard'); }
- 检查图书是否已被租赁(通过
kiraliMi字段),避免重复租赁同一本图书:
if($kitaplar->kiraliMi == 1) { session()->flash('message','该图书已被租赁。'); return redirect('/user/dashboard'); }
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

