【问题标题】:Two inserts in one function一个功能中的两个插入
【发布时间】:2018-11-19 23:09:08
【问题描述】:

我用两个插入语句构建了一个函数。第一个只在表中插入两个名称字段,第二个从第一个读取一个 id 字段,该字段是通过 insert 语句创建的,在数据​​库上自动递增。

这是正确的方法吗?

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!');
}   

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    我会这样更改您当前的代码:

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

    因为现在,我们可以删除完整的Group::where 查询,我们可以保证您获得正确的递增 ID。

    你也可以使用transactions

    【讨论】:

      【解决方案2】:

      #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');
          }
      }
      

      GroupSubscription 模式

      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 standards。另外,请关注 Laravel 社区接受的naming conventions

      【讨论】:

      • #1 简单:您的代码不工作。当我这样做时,我得到 Null for $group_create->idgroups;有什么想法吗?
      • idgroups 是主键吗?
      • 是的,idgroups 是主键。
      • 它在我的 Mac 上就像一个魅力。你能告诉我完整的模型和控制器吗?
      • 我的模型只受保护 $table = 'groups';
      【解决方案3】:

      当在 db 中保存多于一项时,您可以使用数据库事务。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 2014-12-27
        相关资源
        最近更新 更多