当变量为false时where子句不考虑进入SQL查询?

TrO*_*nNe 12 php mysql sql laravel

我有一些我不太了解的东西,我有解决方案,但我不知道为什么这会让我有点疯狂

调节器

DB::connection()->enableQueryLog();

$transfer = Transfer::where('ticket_id', $last_ticket)->where('event_id', 36)->where('buyer', $user_email)->first();

$queries = DB::getQueryLog();

dd($queries);
Run Code Online (Sandbox Code Playgroud)

结果

array:1 [
  0 => array:3 [
    "query" => "select * from `transfers` where `ticket_id` = ? and `event_id` = ? and `buyer` = ? limit 1"
    "bindings" => array:3 [
      0 => false
      1 => 36
      2 => "[email protected]"
    ]
    "time" => 0.36
  ]
]
Run Code Online (Sandbox Code Playgroud)

情况: $last_ticket在DB中是唯一的,永远不会null,空或false.

在我的例子$last_ticketfalse,但在DB中没有任何false,为什么我仍然得到结果?

是因为只要条件是假的,它就不会进入等式吗?

所以问题是:我如何才能收到正确的结果含义:如果$ last_ticket为false则没有结果,如果它有一些数据,则返回由$ last_ticket限制的行结果

一种选择可能是if($last_ticket == false){$last_ticket='randomInexistentString_ag4dh&2g32y4t'}因为它不是零或零,但我不认为这是更漂亮的方式

Joe*_*inz 13

MySQL中的零总是匹配任何不以数字开头的字符串 - 这是因为它希望比较的两边都是相同的类型,因此它将字符串转换为数字,以及任何不转换的字符串以数字开头评估为0自动.

现在,你不是在喂它0- 但是你正在喂它false,而在MySQL中,这不是一个真正的布尔值,而实际上是一个0.

如果不确切知道你的数据库是什么样的,我会说这是最可能的解释.

有办法解决这个问题,例如你可以在->when()Eloquent上使用链接:

Transfer::where('event_id', 36)
        ->where('buyer', $user_email)
        ->when($last_ticket, function ($query) use ($last_ticket) {
            $query->where('ticket_id', $last_ticket);
        })
        ->first();
Run Code Online (Sandbox Code Playgroud)

(取自记忆,语法可能有点偏离.感谢Rick James在评论中进行更正.)