Laravel获取最后插入的数据

时间:2017-12-09 19:04:26

标签: php laravel

请找到下面的代码,我在这里尝试创建主记录,并根据我添加相关数据的ID。

    $country = new Country;

    $country->name = $request->post('country-name');
    $country->xyz  = $request->post('xyz');

    if($country->save()) {
        $n = count($request->post('bname'));

        for ($i = 0; $i < $n; $i++) {
            $dimention = new BoxDimentions;

            $dimention->name = $request->post('bname')[$i];
            $dimention->xyz  = $request->post('xyz')[$i];
            $dimention->cid  = $country->id;

            $dimention->save();
        }
    }

是否有任何内置的laravel功能可用于获取有关country&amp ;;的所有信息操作后的BoxDimentions(包括id,日期时间戳等)?

我在Country Model类中创建了一个关系&#34; box&#34;这将返回所有的盒子信息。我知道我可以使用带有最后创建的国家/地区ID的其他查询来获取数据。我不想再去查询,因为我相信我们掌握了所有数据。

4 个答案:

答案 0 :(得分:2)

执行save()后,您将获得带有ID的模型。您可以使用$model->id访问它。所以,你可以这样做:

$country = new Country;

$country->name = $request->post('country-name');
$country->xyz  = $request->post('xyz');

$dimentionIds = [];

if ($country->save()) {
    $n = count($request->post('bname'));

    for ($i = 0; $i < $n; $i++) {
        $dimention = new BoxDimentions;

        $dimention->name = $request->post('bname')[$i];
        $dimention->xyz  = $request->post('xyz')[$i];
        $dimention->cid  = $country->id;

        $dimention->save();

        $dimentionIds[] = $dimention->id;
    }
}

dd($dimentionIds, $country->id);

如果您需要所有数据,只需保存整个对象:

 $dimentions[] = $dimention;

答案 1 :(得分:1)

我仍然不完全确定你在问什么。如果可以做出类似这样的新查询:

$country->refresh();

将从数据库重新加载当前模型以及从数据库中新加载的任何已加载的关系。

$country->id;
$country->created_at;
$firstBox = $country->boxes->first();
$firstBox->id;
$firstBox->created_at;

看起来你宁愿不再有任何疑问,也没关系。只要数据库没有设置您需要的默认值,您就可以将这些记录实际添加到关系中,而不是重新加载关系。

假设您拥有自己的国家并加载了这种关系:

 $country->load('boxes');
 // or maybe because of eager loading
 $country = Country::where(...)->with('boxes')->first();

 ...
 foreach ( something ) {
     $dimention = new BoxDimentions;
     ...
     $dimention->save();
     $country->boxes->add($dimention);
 }

 return $country;

$country->boxes将包含您之前加载的所有项目以及所有新记录。

如果您只想要新的关系,您可以将关系设置为新关系的集合。

$country->setRelation('boxes', $country->newCollection());

foreach ( something ) {
    ...
    $country->boxes->add($dimention);
}

现在$country->boxes就是那些新的。

答案 2 :(得分:0)

如果你已经设置了关系,下面的代码不会为你完成吗?,确定这可能是另一个查询,但它会将数据作为一个集合返回,并保存你自己处理它。

dd($country->boxes);

答案 3 :(得分:0)

不幸的是save()返回bool。

您可以使用create()静态包装器来获取最近创建的模型实例。

您可能希望重构该代码,因此在您的Country模型中,您将创建一个这样的函数(假设您已定义关系Country和BoxDimensions):

您的国家/地区型号:

public function addBoxDimensions(array $data){

    return $this->boxes()->create($data);
}

然后你的控制器看起来像这样:

$country = new Country;

$country->name = $request->post('country-name');

$country->xyz  = $request->post('xyz');

if($country->save()) {

    $n = count($request->post('bname'));

for ($i = 0; $i < $n; $i++) {

            // Here I will use relationships to create box dimensions for given country that's why I do not need to initialize BoxDimentions
           // $dimention = new BoxDimentions;

           $dimention = $country->addBoxDimensions([
             'name' = $request->post('bname')[$i],
             'xyz'  = $request->post('xyz')[$i],
             'cid'  = $country->id 
            ]);
       }
        //here you can return the country with all the box dimentions
        // also used eager loading to load boxdimensions so we can aviod N+1

       return $dimention->load('boxes');  



        }