【问题标题】:Laravel Conditional Clause When()Laravel 条件子句When()
【发布时间】:2017-11-11 01:37:48
【问题描述】:

我是 Laravel 新手,在使用 when() 函数时遇到了问题。首先,我确实有一个包含 3 个输入字段的表单:名称、电子邮件和密码。

<form method="post" action="/users">
    <?php echo csrf_field(); ?>
    <input type="text" name="name" placeholder="Name">
    <input type="email" name="email" placeholder="Email">
    <input type="password" name="password" placeholder="Password">
<input type="submit" value="Create">
</form>

我在控制器文件中也有这段代码。

$role = $request->input('role');

        $first = User::when($role,function ($query) use ($role){
            return $query->where('username',$role);
        })->get();

根据 Laravel 文档,这不应该起作用,因为我提交的表单中没有名为“角色”的元素,并且 $role 变量必须返回 false。但是当我循环 $first 变量时,它包含用户表中的所有记录。所以我试着纠正并把

$role = $request->input('name');

因此,当我将名称放在 User 表中时,它可以完美运行。但是当我在 (input type='text' name='name') 元素处输入任何内容并提交表单时。它再次显示了用户表中的所有记录。我真的很困惑,我认为这与 $request->input() 返回的“假”或“空”有关。请指教。谢谢。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    当给定方法的第一个参数计算结果为真时,when 方法将执行给定的回调。

    【讨论】:

    • 感谢您的回答 Vishal Varshney :)
    • 谢谢@RowelAbenio
    【解决方案2】:

    $rolefalse 时,闭包不会被执行,所以你会简单地得到这个查询:

    User::get();
    

    此查询将只返回所有用户。

    在这种情况下你需要使用简单的where()

    User::where('username', $role)->first();
    

    如果$role 为空,它将返回一个用户对象或null

    【讨论】:

    • 哦,谢谢。现在我懂了。因此,如果第一个参数为 false,when() 方法将不会执行,只会继续使用 get()。我认为如果 when() 方法得到一个错误参数,整个查询将不起作用。我实际上正在探索我可以用这种方法做什么。非常感谢阿列克谢 :)
    【解决方案3】:

    如果设置了$role 变量,那么 mysql 查询将如下所示

    select * from `users` where `role_id` = 1
    

    如果$role 没有像false 那样设置,那么mysql 查询将如下所示

    select * from `users`
    

    您应该编辑您的查询,例如使用if 并使用不同的where()

    【讨论】:

    • 现在我明白当 when() 方法得到一个错误参数时会发生什么。非常感谢 UfguFugullu
    • 没问题 - 我必须自己尝试才能理解这一点。如果这解决了您的问题,请标记此答案。
    猜你喜欢
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多