Laravel-仅在另一个表中有数据时才创建新用户

时间:2018-01-27 13:47:35

标签: php laravel

我有两个表,第一个是用户表,其中有这些属性id,用户名,电子邮件,remember_token,createdat,updateat另一个表叫做receive_pay有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;
    }
}

2 个答案:

答案 0 :(得分:0)

如果您希望使用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()如果数据存在则使语句评估为true,否则为false,并创建新用户。

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

答案 1 :(得分:0)

我认为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文件中添加中间件来保护您的创建用户网址...

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

并在您的web.php路径文件中:

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

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

我希望它对你有用。