保存前返回新的Laravel型号ID

时间:2018-08-01 08:31:26

标签: php laravel laravel-5

我在其他框架上也遇到过类似的问题,但是我似乎找不到Laravel的答案。

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

此刻,我有一个名为Site的模型。

我的网站模型有一个名为prefix的列,该列只是由网站名称加上新的网站ID生成的一些大写字母,因此,例如,网站名称为'clare'的第1行变为'CLA1'并且“便士”变为“ 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,但是我通常正在寻找实现这一目标的最佳,最干净的解决方案。

3 个答案:

答案 0 :(得分:1)

尝试此解决方案:

网站模型:

public function getNextId() 
{

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

     return $statement[0]->Auto_increment;
}

在控制器中:

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

答案 1 :(得分:0)

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

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

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

与您想要的逻辑相同,但是是即时生成的。

答案 2 :(得分:-1)

我是怎么做到的..

所以我有一个模型

我定义

protected $fillable = [] 

带有可大量填充的字段的数组。

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

    $newRow  = Page::create($data);
    if($newRow) {
        return Page::find($newRow->id);
    } else {
        return false;
    }

因此,当创建成功时,我会返回整个记录,否则返回false。

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