在 laravel 5 中注册用户并将数据发送到两个表,这是正确的

Posted

技术标签:

【中文标题】在 laravel 5 中注册用户并将数据发送到两个表,这是正确的【英文标题】:registering a user in laravel 5 and send data to two tables, is this correct 【发布时间】:2015-09-16 06:10:23 【问题描述】:

我正在使用此代码在 Laravel 5.1 中注册用户,并在注册期间获取用户详细信息并将它们存储在第二个表(user_details)中。你认为这是正确的吗?它有效,但我是 laravel 和其他东西的新手,我想看看其他人的想法。

发生的情况是用户表获取名称、电子邮件和密码,而 user_details 表获取其余数据,然后我将用户返回到自动登录作为注册后。

感谢@Shanoop,我将 authController.php 中的 create 函数修改为如下内容:

protected function create(array $data)

    

        $user = User::create([

            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),

        ]);

        $user_details = new User_Detail;

        $user_details->fill([

            'detail_1' => $data['detail_1'],
            'detail_2' => $data['detail_2'],
            'detail_3' => $data['detail_3'],

        ]);


        $user_details->save([$user]);

        return $user;


    

【问题讨论】:

通常像这样拆分一对一的东西是个坏主意。为什么不将用户详细信息放在用户模型中? 用户细节模型对每个细节都有一对多: //eloquent public function user() return $this->hasMany('User'); 公共函数 detail_1() return $this->hasMany('detail_1'); 公共函数 detail_2() return $this->hasMany('detail_2'); 公共函数 detail_3() return $this->hasMany('detail_3'); 【参考方案1】:

Laravel 非常灵活,更新数据库数据非常容易,所以我相信你的问题是数据应该分成 2 个表还是 1 个表 - 如果我错了,请纠正我。

我的经验法则是,如果数据具有一对一的关系,则它属于同一个表。将其拆分为多个表将导致更复杂或需要多个查询来检索信息。

如果关系是一对多或多对多,那么拆分是正确的方法。

请记住,这两条规则都有例外,但它们通常最有意义。

【讨论】:

你好,没有关于“插入相关模型”的问题,如果这是要走的路。这些细节代表其他表的ID(它们都是外键)。 当然很多1对1关系属于一个样本表,但不是每次都需要更多关于要抽象到表中的实体的信息,在某些情况下将不相关的数据放在同一张表是一个坏主意,例如将“帐户”信息与“用户”表放在同一张表上,当您意识到在某些情况下某些用户没有任何帐户时,问题会变得更大。方法是考虑第三范式的表格,但它太抽象了,方法是问自己“我想放在这里的东西是否表达了我想要抽象的真实对象?”【参考方案2】:

首先,我建议您使用Request 对象,从邮寄发送的输入中获取数据。 Request 对象将简化您的数据管理,然后将它们存储在数据库中。

其次如果你在你的模型上定义了$fillable变量,就不需要一个一个的传递数据了。

你的模型:

class UserDetails extends model
   protected $fillable = ["detail_1", "detail_2", "detail_3"];

你的控制器方法:

$user_details = new UserDetails();
$user_details->fill($data); //laravel automatically take only 
                           //the vars defined on $fillable variable in your method

另一个更简单的例子:

$user_details = new UserDetails($data); //laravel gonna call fill method when you pass a var in the constructor

但是,如果您只想传递您想要填充的变量,因为您想要更安全地使用您的变量,使用 Request 对象您可以这样做:

public update (Request $request) 
    /*
     * when you pass a laravel object "Request", it gonna be filled automatically by laravel 
     */
    $user_details = new UserDetails();
    $user_details->fill( $request->only("details_1", "details_2") );

第三个也是最后一个: 如何管理表之间的关系

1.- 你需要在 laravel 约定中定义你的表格(更容易),这意味着你的表格需要在下划线约定中声明为复数主题,表格带有依赖项需要一个外键,该 var 需要以单数形式命名为您的表,后跟:_id

示例:

users:
id, name

===============
user_details:
id, user_id, detail_1

2.-你需要声明你的模型

(如果您使用作曲家,步骤 1 和 2 很容易,只需调用 php artisan make:model User 如果您使用 laravel 5.1 添加 --migration-m 进行迁移 php artisan make:model User -m

您的用户模型需要具有 1 对 1 的关系,因此请查看文档:laravel relationships

您的用户模型:

public class User extends Model
    public function user_detail()
       return $this->hasOne("App\UserDetail");
    

您的 UserDetails 模型:

public UserDetail extends Model
    public function user()
        return $this->belongsTo("App\User");
    

所以当你想存储时

$user = new User($data);
$user_details = new UserDetails($data);
$user->save();
$user->user_detail()->save($user_details);

【讨论】:

感谢您提供此信息。三思而后行,我决定避免拆分用户表 非常聪明的决定 xD

以上是关于在 laravel 5 中注册用户并将数据发送到两个表,这是正确的的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中为每个用户生成唯一的随机值并将其添加到数据库中

如何在 laravel 中为每个用户生成唯一的自动增量值并将其添加到数据库中

Laravel 5.4 - 单击电子邮件中的验证链接时未传递或发送电子邮件验证令牌令牌。

Laravel 5.1 中的多步注册

在 UWP 应用中使用 AudioGraph 将音频输出发送到两台设备

Laravel 5.5 不发送电子邮件