konz laugoko
konz laugoko

Reputation: 79

Laravel- Creating new user only if there is data in another table

I have two tables the first one is the user table which have these property id, username, email,remember_token, createdat, updateat another table is called received_pay having id, email, token my task is to check if the email, and token entered by the user must match the ones in received_pay otherwise new user is not created, thanks for your time in advanced,

I'm trying to create new user on a condition that if there is data in another table then new user is created otherwise not I have put my code inside if else statement and is throwing errors.

my function for creating new user is listed below:

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;
    }
}

Upvotes: 1

Views: 684

Answers (2)

JBoy
JBoy

Reputation: 144

If you wish to do it with if statement then do it like below

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;
    }
}

the count() in the if is to make the statement evaluate true if the data exists and false otherwise and create the new user.

I think that solves your problem.

Upvotes: 0

fmgonzalez
fmgonzalez

Reputation: 823

I think that the best approach in Laravel is create a middleware to protect this url. If you already have this create user feature working is better don't modify it.

So the first step would be create a middleware (https://laravel.com/docs/5.5/middleware) to add your safeguard, something like this:

<?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);
    }
}

Then you would need to create a route to handle this invalid creation users (this no-payment url).

And finally you can protect your create-user url in route, by adding your middleware in your kernel.php file...

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

and in your web.php route file:

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

In this way your code will look cleaner, tidier, and closer to the way Laravel works.

I hope it would work fine for you.

Upvotes: 1

Related Questions