Php 在将模型保存到数据库后,是否有一种干净的方法来使用它的id?

Php 在将模型保存到数据库后,是否有一种干净的方法来使用它的id?,php,laravel,eloquent,backend,Php,Laravel,Eloquent,Backend,我正在学习laravel框架,目前我正在构建一个非常小的应用程序,将有效URL缩短为这种格式: http://localhost/374该数字表示保存在数据库中的url模型的id 因此,为了获得该id(它是一个自动递增属性),我将url模型保存到数据库中,这样我就可以检索该id并将其连接到基本应用程序url。我这里的问题是,我正在为一个任务做两个查询,我不知道这是否是一个糟糕的做法,但如果有更好的方法,我愿意接受建议。 以下是负责此过程的控制器方法: public function sh

我正在学习laravel框架,目前我正在构建一个非常小的应用程序,将有效URL缩短为这种格式:
http://localhost/374
该数字表示保存在数据库中的url模型的id

因此,为了获得该id(它是一个
自动递增
属性),我将url模型保存到数据库中,这样我就可以检索该id并将其连接到基本应用程序url。我这里的问题是,我正在为一个任务做两个查询,我不知道这是否是一个糟糕的做法,但如果有更好的方法,我愿意接受建议。 以下是负责此过程的控制器方法:

    public function shorten(Request $request)
    {
        $url =  Validator::make($request->all(), [
            'url' => 'url'
        ])->validate()['url'];

        $url_model = Url::firstOrNew(['url' => $url]);

        if ($success = $url_model->exists)

            // the model exists in the database .
            // we'll retrieve the shortend url and skip directly to displaying the view .
            $shortend_url = $url_model->shortend_url;

        elseif ($success = $url_model->save()) {

            // it does not exist, so we'll save it to retrieve the id assigned by the database .
            $shortend_url = env('APP_URL') . '/' . $url_model->id;
            $success = $url_model->update(compact('shortend_url'));
        }

        return view('result', compact('success', 'url', 'shortend_url'));
    }
试试这个

  public function shorten(Request $request)
    {
        $url =  Validator::make($request->all(), ['url' => 'url'])->validate()['url'];
        $url_model = Url::firstOrNew(['url' => $url]);

        if (!$url_model->exists) {
            $url_model->save();
        }
        $shortend_url = env('APP_URL') . '/' . $url_model->id;
        return view('result', compact( 'url', 'shortend_url'));
    }

成功保存后是否未将ID分配给您的模型?您可以只使用
$url\u model->ID
,而不使用getAttribute。无论哪种方式,它都不是真正的两个查询,因为一旦保存它,
$url\u model
将使用当前属性进行更新。我们假设该列是一个
自动增量
。许多因素、RDBMs等。也许阅读和/或查看laravel源代码以了解其工作原理。@aynber但您看到,在第一次保存模型后,我可以访问id,然后我使用该id创建一个短端url,然后我用该短端url更新模型,不是吗?这两个查询不是这样做的,在您的模型上使用将自动更新属性的。您在分配$shortend\u url后忘记更新模型您的shortend\u url是您的url和您的modelID的组合,没有必要存储在DBoh中是的,我不敢相信我错过了这么明显的一点,谢谢。