Две вставки в одной функции - PullRequest
0 голосов
/ 10 июня 2018

Я строю функцию с двумя операторами вставки.Первый из них вставляет только два поля имени в таблицу, а второй считывает поле идентификатора из первого поля, которое создается с помощью оператора вставки, автоматически увеличивается в базе данных.

Это правильный способ сделать это?

public function submit(Request $request)
{
    $this->validate($request, [
        'groupname' => 'required|unique:groups,group_name'
    ]);

    $groups_create = new Group();
    $groups_create->group_name = $request->input('groupname');
    $groups_create->group_admin = Auth::id();
    $groups_create->save();

    $groupid = Group::where('group_name', $request->input('groupname'))->select('idgroups')->first();

    $groups_create_subscription = new GroupSubscription();
    $groups_create_subscription->idgroups = $groupid->idgroups;
    $groups_create_subscription->subscriber = Auth::id();
    $groups_create_subscription->save();

    return redirect('home')->with('success', 'Ihre Gruppe wurde angelegt!');
}   

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

При сохранении более одного элемента в БД вы должны использовать транзакцию базы данных.

public function submit(Request $request)
{
    $this->validate($request, [
        'groupname' => 'required|unique:groups,group_name'
    ]);

    DB::beginTransaction();
    $groups_create = new Group();
    $groups_create->group_name = $request->input('groupname');
    $groups_create->group_admin = Auth::id();
    $groups_create->save();

    if (!$groups_create->save()) {
        DB::rollBack();
        return redirect('home')->with('danger', 'Group not saved!');
    }

    $groupid = Group::where('group_name', $request->input('groupname'))->select('idgroups')->first();

    $groups_create_subscription = new GroupSubscription();
    $groups_create_subscription->idgroups = $groupid->idgroups;
    $groups_create_subscription->subscriber = Auth::id();

    if (!$groups_create_subscription->save()) {
        DB::rollBack();
        return redirect('home')->with('danger', 'Group not saved!');
    }

    DB::commit();
    return redirect('home')->with('success', 'Ihre Gruppe wurde angelegt!');
}

также вы можете использовать для сохранения этой структуры.Смотри официальную документацию https://laravel.com/docs/5.5/eloquent#mass-assignment

$data = [
    'group_name' => $request->input('groupname'),
    'group_admin' => Auth::id()
];

$groups_create Group::craete($data);
0 голосов
/ 10 июня 2018

# 1 (Простой)

Нет необходимости создавать новый запрос для поиска $groupid.Вы можете получить $groupid вот так:

$groups_create              = new Group();
$groups_create->group_name  = $request->input('groupname');
$groups_create->group_admin = Auth::id();
$groups_create->save();

$groups_create_subscription             = new GroupSubscription();
$groups_create_subscription->idgroups   = $group_create->idgroups;
$groups_create_subscription->subscriber = Auth::id();

# 2 (транзакции с базой данных)

DB::beginTransaction();

try {
    $groups_create              = new Group();
    $groups_create->group_name  = $request->input('groupname');
    $groups_create->group_admin = Auth::id();
    $groups_create->save();

    $groups_create_subscription             = new GroupSubscription();
    $groups_create_subscription->idgroups   = $group_create->idgroups;
    $groups_create_subscription->subscriber = Auth::id();

    DB::commit();

    return redirect('home')->with('success', 'Ihre Gruppe wurde angelegt!');
} catch (\Exception $e) {
    DB::rollBack();

    return redirect('home')->with('danger', 'Group not saved!');
}

# 3 (определение отношений)

Eloquent отношения определяются как методы в ваших классах модели Eloquent.Поскольку, как и сами модели Eloquent, отношения также служат мощными построителями запросов, определение отношений как методов обеспечивает мощные возможности цепочки методов и запросов

Групповая модель

class Group extends Model
{
    public function subscriptions()
    {
        return $this->belongsTo('App\GroupSubscription', 'idgroups', 'idgroups');
    }
}

Модель групповой подписки

class GroupSubscription extends Model
{
    public function group()
    {
        return $this->hasOne('App\Group', 'idgroups', 'idgroups');
    }
}

Контроллер

$groups_create              = new Group();
$groups_create->group_name  = $request->input('groupname');
$groups_create->group_admin = Auth::id();
$groups_create->save();

$groups_create->subscriptions()->create([
    'subscriber' => Auth::id(),
]);

// It will automaticaly set idgroups

# 4 (Соглашения об именах)

Следовать стандартам PSR .Кроме того, следуйте соглашениям об именах , принятым сообществом Laravel.

0 голосов
/ 10 июня 2018

Я бы изменил ваш текущий код следующим образом:

$group = Group::create([
    'group_name' => $request->input('groupname'),
    'group_admin' => Auth::id()
]);

GroupSubscription::create([
    'idgroups' => $group->idgroups,
    'subscriber' => Auth::id()
]);

, потому что теперь мы можем вырезать полный запрос Group::where и можем гарантировать, что вы получаете правильный увеличенный идентификатор.

Вы также можете использовать транзакции .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...