【问题标题】:Laravel- Creating new user only if there is data in another tableLaravel-仅当另一个表中有数据时才创建新用户
【发布时间】:2018-01-27 13:47:34
【问题描述】:

我有两个表,第一个是用户表,它具有这些属性 id、用户名、电子邮件、remember_token、createdat、updateat 另一个表称为 received_pa​​y 具有 id、email、token 我的任务是检查电子邮件是否和用户输入的令牌必须与 received_pa​​y 中的令牌匹配,否则不会创建新用户,感谢您的宝贵时间,

我正在尝试创建新用户,条件是如果另一个表中有数据,则创建新用户,否则我没有将我的代码放入 if else 语句中并引发错误。

我创建新用户的功能如下:

protected function create(array $data)
{
    /*$exists = \DB::table('received_pay')->where('email', $data['email'])->first();  */
    $exists=\DB::table('received_pay')->where('email', '=', $data['email'])->where('token', $data['token'])->exists();

    if ($exists === null)
    {
        // user doesn't exist
        return User::create([
            'username' => $data['username'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'token'   => $data['token'],
        ]);
    }
    else
    {
        return null;
    }
}

【问题讨论】:

  • 它会抛出什么样的错误?
  • this answer 的第一部分解决了原来的问题(“Argument 1 pass to...”错误),所以你应该accept the answer
  • Alexey Mezenin 解决了错误,我现在面临的问题是检查第一个表“received_pa​​y”然后在第二个“用户”表中添加数据的逻辑,Laravel 通过使用实现验证有限制的唯一关键字,我想使用上面代码中显示的 If Else 语句。

标签: php laravel


【解决方案1】:

我认为 Laravel 中最好的方法是创建一个中间件来保护这个 url。如果您已经拥有此create user 功能,最好不要修改它。

所以第一步是创建一个中间件 (https://laravel.com/docs/5.5/middleware) 来添加您的保护措施,如下所示:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckPayment
{
    public function handle($request, Closure $next)
    {
        $payment = \DB::table('received_pay')->where('email', $request->email)->where('token', $request->token]);
        if (!$payment->count()) {
            return redirect('no-payment');
        }

        return $next($request);
    }
}

然后你需要创建一个路由来处理这个无效的创建用户(这个no-payment url)。

最后,您可以通过在 kernel.php 文件中添加中间件来保护您的创建用户 url...

protected $routeMiddleware = [
    ...
    'payment' => \App\Http\Middleware\CheckPayment::class,
];

在你的web.php 路由文件中:

Route::post('user', 'UserController@create')->middleware('payment');

通过这种方式,您的代码将看起来更干净、更整洁,并且更接近 Laravel 的工作方式。

我希望它对你有用。

【讨论】:

  • 谢谢 fmgonzalez,我现在就写,我会告诉你进展如何。
  • 谢谢大哥!你是一个救生员。效果很好。
  • 不客气,我很高兴它对你有用。请将答案标记为解决方案;-)
  • 我尝试将其标记为已解决,但我没有足够的声誉,因此不会公开显示,我会在获得足够的声誉后这样做,谢谢。
  • 好吧,够公平的;-)
【解决方案2】:

如果你想用 if 语句来做,那么像下面这样做

protected function create(array $data)
{
    /*$exists = \DB::table('received_pay')->where('email', $data['email'])->first();  */
    $exists=\DB::table('received_pay')->where('email', '=', $data['email'])->where('token', $data['token']);

    if (!$exists->count())
    {
        // user doesn't exist
        return User::create([
            'username' => $data['username'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'token'   => $data['token'],
        ]);
    }
    else
    {
        return null;
    }
}

if 中的count() 是让语句在数据存在时判断为真,否则为假并创建新用户。

我认为这可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2016-09-21
    • 2016-01-20
    • 2021-12-31
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多