我在其他框架上也遇到过类似的问题,但是我似乎找不到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,但是我通常正在寻找实现这一目标的最佳,最干净的解决方案。
答案 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。
当然,这是在模型中的函数中实现的。因此,您需要从控制器或其他地方调用它:)