Laravel Eloquent-firstOrCreate()关于一段关系


Laravel Eloquent - firstOrCreate() on a relationship

当我在另一个模型的关系上尝试firstOrCreate()时,它不起作用:

Client::find($id)->users()->firstOrCreate(array('email' => $email));

这返回一个错误,称

调用未定义的方法Illuminate''Database''Query''Builder::firstOrCreate((

不过,直接在模型User上运行此操作将起作用。

这不起作用,您必须手动/直接使用User模型来完成,因为users((应该返回一个收集对象

这是正确的,users((函数不会返回(新的、空的或创建的(User模型,而是返回一个集合对象。

它也有文件记录http://laravel.com/docs/5.1/eloquent-relationships#inserting-相关的模型,如果你使用laravel关系,它应该工作。

你误解了那个文件。关系对象有一个create((方法和一个save((方法,但是关系对象不是完整的模型对象。要获得完整User模型对象(如firstOrCreate(((的所有功能,必须在模型对象上调用它们。

因此,例如,这个代码应该可以工作:

$user = User::firstOrNew(array('email' => $email));
Client::find($id)->users()->save($user);

请注意,直接从Client模型的关系中将$user对象保存在此处应该是可以的,即使它可能已经存在于此处,但在执行此操作时,它应该只更新$user对象上的Client_id字段。

您可以使用updateOrCreate:

$user = App'User::query()->firstWhere('email', 'radical@example.com');
$user->sandwiches()->updateOrCreate(['user_id' => $user->id], [
    'cabbage' => false,
    'bacon' => 9001,
]);

CCD_ 4具有两个参数。第一个是匹配条件。第二个是追加销售数据。例如,如果没有具有user_id === $user->id的行,则将使用该行和第二个参数中的字段创建一条记录。

firstOrCreate方法将尝试使用给定的列/值对来定位数据库记录。如果在数据库中找不到模型

public function firstOrCreate() {
    $requestData = [
        'name' => 'Salma Klocko',
        'email' => 'maida39@frami.biz'
    ];
    $customer = Customer::firstOrCreate($requestData);
    echo "Insert customer detail Successfully with ID : " . $customer->id;
}

这应该做:

Client::find($id)->first()->users()->firstOrCreate(array('email' => $email));