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

时间:2014-05-31 01:40:11

标签: php laravel eloquent relationship

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

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

这会返回错误

  

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

直接在模型User上运行它会起作用。

4 个答案:

答案 0 :(得分:3)

  

这不起作用,你必须手动/直接使用User模型,因为users()应该返回一个集合对象

这是正确的,users()函数不返回(new,empty或created)User模型,它返回一个集合对象。

  

如果您使用laravel关系,它还会记录http://laravel.com/docs/5.1/eloquent-relationships#inserting-related-models

您误解了该文档。关系对象具有create()方法和save()方法,但关系对象不是完整的模型对象。要获得完整用户模型对象的所有功能(例如firstOrCreate()),您必须在模型对象上调用它们。

因此,例如,此代码应该有效:

magento 1.9.2.1

请注意,直接从客户端模型的关系中保存$ user对象应该没问题,即使它可能已经在这里存在,它应该只是更新$ user对象上的client_id字段。

答案 1 :(得分:1)

这应该做:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以使用updateOrCreate

$user = App\User::query()->firstWhere('email', 'radical@example.com');

$user->sandwiches()->updateOrCreate(['user_id' => $user->id], [
    'cabbage' => false,
    'bacon' => 9001,
]);

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