laravel firstOrCreate不能正常工作?

时间:2016-01-07 16:02:18

标签: php laravel eloquent unique laravel-5.1

我使用foursquare api导入一些数据。我的数据库包含多个foursquare_id重复项。我在这里做错了吗?

我认为设置它的方式会检查数据库中foursquare_id的列值吗?

Bar::firstOrCreate([
    // do not check for these 2 below because they are mandatory
    'foursquare_id' => $item['venue']['id'],
    'name' => $item['venue']['name'],
    'postalCode' => isset($item['venue']['location']['postalCode']) ? $item['venue']['location']['postalCode'] : '',
    'city' => isset($item['venue']['location']['city']) ? $item['venue']['location']['city'] : '',
]);

2 个答案:

答案 0 :(得分:10)

没错。如果行对象中存在所有元素,则只会收到“第一个”。

替代方案是使用firstOrNew:

$foo = Bar::firstOrNew(['foursquare_id' => $item['venue']['id']]); // find the object with this foursquare_id. Nothing found? Create a new one with the given foursquare_id
$foo->name = $item['venue']['name'];
$foo->postalCode = isset($item['venue']['location']['postalCode']) ? $item['venue']['location']['postalCode'] : '';
$foo->city = isset($item['venue']['location']['city']) ? $item['venue']['location']['city'] : '';
$foo->save();

答案 1 :(得分:0)

此外,firstOrNew将收到2个参数。第一个是查询,第二个是创建。

因此,您可以按foursquare_id进行查询,如果没有创建所有参数。

像这样:

Bar::firstOrCreate(
    // Query only by foursquare_id
    ['foursquare_id' => $item['venue']['id']],
    // But, if ends up creating a Bar, also add this parameters
    [
        'name'       => $item['venue']['name'],
        'postalCode' => isset($item['venue']['location']['postalCode']) ? $item['venue']['location']['postalCode'] : '',
        'city'       => isset($item['venue']['location']['city']) ? $item['venue']['location']['city'] : '',
    ]
);

文档中的更多信息:https://laravel.com/docs/5.5/eloquent