为什么我可以以一对一的关系提交多条记录?

时间:2016-02-24 03:27:56

标签: php laravel laravel-5 eloquent laravel-5.2

我使用的是Laravel 5.2。为什么我可以以一对一的关系提交多条记录?有两个表,userprofile,它们具有一对一的关系。

用户:

class User extends Authenticatable
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

资料:

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

我已经建立了一对一关系,但我可以通过一个用户帐户向表profile提交多条记录。这是为什么?

1 个答案:

答案 0 :(得分:2)

您的关系设置正确。 hasOnehasMany之间的唯一区别是hasOne只会返回第一条相关记录。没有什么可以阻止您尝试关联多个记录,但是当您检索相关记录时,您将只获得一个。

例如,给出以下代码:

$user = User::first();
$user->profile()->save(new Profile(['name' => 'first']));
$user->profile()->save(new Profile(['name' => 'second']));

$user->load('profile');
$echo $user->profile->name; // "first"

这是完全有效的代码。它将创建两个新的配置文件,每个配置文件将设置为指定用户user_id。但是,当您通过$user->profile访问相关配置文件时,它只会加载其中一个相关配置文件。如果您已将其定义为hasMany,则会加载所有相关配置文件的集合。

如果您想防止意外创建多个配置文件,则需要在代码中执行此操作:

$user = User::first();

// only create a profile if the user doesn't have one.
// don't use isset() or empty() here; they don't work with lazy loading.
if (!$user->profile) {
    $user->profile()->save(new Profile());
}