You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

另外,建议补充以下优化点:

  1. 对Kitaplar::find($kitap_id)添加空值判断,避免图书不存在时抛出错误:
$kitaplar = Kitaplar::find($kitap_id);
if(!$kitaplar) {
    session()->flash('message','指定图书不存在。');
    return redirect('/user/dashboard');
}
  1. 检查图书是否已被租赁(通过kiraliMi字段),避免重复租赁同一本图书:
if($kitaplar->kiraliMi == 1) {
    session()->flash('message','该图书已被租赁。');
    return redirect('/user/dashboard');
}

内容的提问来源于stack exchange,提问作者Thor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:24:47