Php 保存前返回新的Laravel模型ID

Php 保存前返回新的Laravel模型ID,php,laravel,laravel-5,Php,Laravel,Laravel 5,我在其他框架中也看到过类似的问题,但我似乎找不到Laravel的答案 实现我的目标的最佳实践/最干净的解决方案是什么 现在让我们假设我有一个名为Site的模型 我的站点模型有一个名为prefix的列,它只是由站点名称加上新站点id生成的几个大写字母,因此,例如,站点名称为“clare”的第1行变为“CLA1”,而“pencet”变为“PEN2” 我的问题是我需要新行id来生成前缀,这意味着现在我必须保存它,然后像这样重新保存它 $site = new Sites; $site->name

我在其他框架中也看到过类似的问题,但我似乎找不到Laravel的答案

实现我的目标的最佳实践/最干净的解决方案是什么

现在让我们假设我有一个名为
Site
的模型

我的站点模型有一个名为
prefix
的列,它只是由站点名称加上新站点id生成的几个大写字母,因此,例如,站点名称为“clare”的第1行变为“CLA1”,而“pencet”变为“PEN2”

我的问题是我需要新行
id
来生成前缀,这意味着现在我必须保存它,然后像这样重新保存它

$site = new Sites;
$site->name = 'clare';
$site->save();
//Now that we have saved, we can use the new id to create the prefix and save again
$site->prefix = strtoupper(substr($site, 0, 3)) . $site->id;
$site->save();
我讨厌这样一个事实,我必须再次保存它,一旦它最初被保存,因为我需要id,什么是实现这一目标的最佳方式?是否可以在保存之前返回新模型ID

我知道我可以做一些事情,比如对所有行进行计数,然后通过这种方式获得ID,但我通常都在寻找最好、最干净的解决方案来实现这一点。

尝试以下解决方案:

站点模型:

public function getNextId() 
{

     $statement = DB::select("show table status like 'sites'");

     return $statement[0]->Auto_increment;
}
注意:不要忘记使用“use-Illumb\Support\Facades\DB”导入DB

在控制器中:

$site = new Sites;
$site->name = 'clare';
$site->prefix = strtoupper(substr($site->name, 0, 3)) . $site->getNextId();
$site->save();
尝试以下解决方案:

站点模型:

public function getNextId() 
{

     $statement = DB::select("show table status like 'sites'");

     return $statement[0]->Auto_increment;
}
注意:不要忘记使用“use-Illumb\Support\Facades\DB”导入DB

在控制器中:

$site = new Sites;
$site->name = 'clare';
$site->prefix = strtoupper(substr($site->name, 0, 3)) . $site->getNextId();
$site->save();

我是怎么做到的

所以我有一个模型

我定义了

protected $fillable = [] 
包含可以进行大规模填充的字段的数组

现在我需要一个包含数据和批量创建的数组:

    $newRow  = Page::create($data);
    if($newRow) {
        return Page::find($newRow->id);
    } else {
        return false;
    }
因此,当创作成功时,我会取回整个记录,否则会出错


当然,这是在模型中的一个函数中实现的。因此,您需要从控制器或其他地方调用它:)

我是如何做到这一点的

所以我有一个模型

我定义了

protected $fillable = [] 
包含可以进行大规模填充的字段的数组

现在我需要一个包含数据和批量创建的数组:

    $newRow  = Page::create($data);
    if($newRow) {
        return Page::find($newRow->id);
    } else {
        return false;
    }
因此,当创作成功时,我会取回整个记录,否则会出错


当然,这是在模型中的一个函数中实现的。因此,您需要从控制器或其他地方调用它:)

我在回答中假设了一些事情,例如,您永远不会使用前缀来定义关系或标识站点。应始终使用ID完成此操作

我建议在Sites类中使用属性和方法来检索
前缀

private $generatedPrefix = null;

public function getPrefixAttribute() {
    if ($this->generatedPrefix === null) {
        $this->generatedPrefix = strtoupper(substr($this->site, 0, 3)) . $this->id;
    return $this->generatedPrefix;
}
通过这种方式,您可以使用以下代码访问它:

$site->prefix

与您想要的逻辑相同,但是动态生成的。

我在回答中假设了一些事情,比如您永远不会使用前缀来定义关系或标识站点。应始终使用ID完成此操作

我建议在Sites类中使用属性和方法来检索
前缀

private $generatedPrefix = null;

public function getPrefixAttribute() {
    if ($this->generatedPrefix === null) {
        $this->generatedPrefix = strtoupper(substr($this->site, 0, 3)) . $this->id;
    return $this->generatedPrefix;
}
通过这种方式,您可以使用以下代码访问它:

$site->prefix


与您想要的逻辑相同,但是动态生成的。

是否需要将其保存在数据库中?那个专栏是干什么的?您不能使用动态返回前缀的自定义属性/访问器吗?您不能在保存数据之前获取
id
。。如果您从
中以“降序”获取
id
,则可以获取最后一个
id
,这也不好,因为有些记录可能已经被删除。因此,如果您真的需要
id
,我希望这是唯一的解决方案。为什么不在模型上定义前缀方法,并在每次需要时生成前缀?@DouwedeHaan我们如何在模型上定义前缀方法?@请参见下面的我的答案是否需要将其保存在数据库中?那个专栏是干什么的?您不能使用动态返回前缀的自定义属性/访问器吗?您不能在保存数据之前获取
id
。。如果您从
中以“降序”获取
id
,则可以获取最后一个
id
,这也不好,因为有些记录可能已经被删除。因此,如果您真的需要
id
,我希望这是唯一的解决方案。为什么不在模型上定义前缀方法,并在每次需要时生成前缀?@DouwedeHaan我们如何在模型上定义前缀方法?@请参见下面的我的答案此解决方案需要为表添加插入块我不明白您的意思!什么insert block@J.Doetable lock我甚至不知道“show table status”mysql命令存在!你每天都能学到新东西。这似乎是一个干净的好方法,谢谢!我不确定您是否需要插入块,正如您所说@J.Doe让我们测试一下:)对于此解决方案,需要为表格添加插入块我不明白您的意思!什么insert block@J.Doetable lock我甚至不知道“show table status”mysql命令存在!你每天都能学到新东西。这似乎是一个干净的好方法,谢谢!我不确定您是否需要插入块,正如您所说@J.Doe让我们测试一下:)不确定这是否与问题相关。。答案部分在那里。。他还可以在返回之前执行`$newRow->prefix=“bla bla”$newRow->id$newRow->save();返回页面::查找($newRow->id)`他已经弄明白了这个部分。他遇到的问题或挑战是做两个查询而不是一个查询,这是他更喜欢的…嗯,我明白了。。好那么祝你好运。。我不建议采取这一战略。但我对解决方案很好奇。不确定这是否与问题有关。。答案部分在那里。。他还可以在返回之前执行`$newRow->prefix=“bla bla”$newRow->id$newRow->save();返回页面::查找($newRow->id)`他已经弄明白了这个部分。他遇到的问题或挑战是做两个查询而不是一个查询,这是他更喜欢的…嗯,我明白了。。好那么祝你好运。。我不建议采取这一战略。但我对这个很好奇