Вставка в две таблицы при регистрации пользователей в Laravel

Я использую регистрацию пользователя Laravel 5.1 по умолчанию. У меня есть две таблицы: пользователи и магазины. Когда пользователь регистрируется, приложение должно вставить пользователя в таблицу пользователей, получить идентификатор и использовать его для регистрации магазина. Я читал AuthController.php по умолчанию, но ничего не нашел. Вот AuthController, если это поможет.

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest', ['except' => 'getLogout']);
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            //'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed|min:6',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        return User::create([
            //'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }

    /**
     * Get the path to the login route.
     *
     * @return string
     */
    public function loginPath()
    {
        return route('login');
    }

    /**
     * Get the post register / login redirect path.
     *
     * @return string
     */
    public function redirectPath()
    {
        return route('home');
    }
}

Решено, но теперь у меня нарушение ограничения целостности. Этот код правильный?

protected function create(array $data)
    {
        $user = new User([
            'email' => $data['email'],
            'password' => bcrypt($data['password'])
        ]);

    $user->role = 'shop_owner';
    $user->remember_token = str_random(10);

    $user->save();

    $userId = $user->id;

    Shop::create([
        'name' => $data['s_name'],
        'address' => $data['s_address'],
        'CP' => $data['s_pcode'],
        'Telephone' => $data['s_tlf'],
        'contact_name' => $data['cp_name'],
        'contact_num' => $data['cp_tlf'],
        'id_user' => $userId
    ]);

    return $user;
}

person Daniel Vivas    schedule 08.08.2016    source источник


Ответы (3)


Ну вот:

protected function create(array $data)
        {
            $user = User::create([
                //'name' => $data['name'],
                'email' => $data['email'],
                'password' => bcrypt($data['password']),
            ]);

            $userId = $user->id;
            Shop::create([... use $userId here ...]);
            return $user;
        }
person Tom    schedule 08.08.2016
comment
Не понимаю, почему, если только вы не собираетесь передавать больше параметров. - person Tom; 08.08.2016
comment
Теперь у меня нарушение ограничения целостности, я отредактировал вопрос, правильный ли этот код? - person Daniel Vivas; 09.08.2016

Это идет к вашему контроллеру:

public function store(Request $request) {
    $user = User::create(Input::all());
    $user->save();

    $shop = Shop::create([..enter shop attributes or leave blank..]);
    $user->shop()->save($shop);
}
person Gadzhev    schedule 08.08.2016
comment
Это контроллер по умолчанию и у меня нет метода хранения, к тому же эта система работает (только сохранение данных в одной таблице) - person Daniel Vivas; 09.08.2016

Вам необходимо разместить следующий код в верхней части контроллера аутентификации.

use App\Shop;
person Brian Hart    schedule 10.01.2019