我开始尝试Eloquent模型。我有以下模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* Class Character
* @package App
*
* @property string $name
* @property int $id
* @property int $score
*/
class Character extends Model
{
protected $table = 'characters';
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
}
}
我的问题是,当我执行以下操作时是否可能:
$ character = new Character(1); // 1是主键
我希望它继续并在数据库中加载信息。如果不存在,我想将1
设置为$character->id
。这可能吗?还是Eloquent已经这样做了,而我只是想念些什么?
答案 0 :(得分:0)
理论上,您可以这样做:
public function __construct($primaryKey)
{
parent::__construct($attributes);
$character = self::find($primaryKey);
if(is_null($character)){
$character = self::find(1);
}
return $character;
}
但是,理想情况下,您不应该这样做,因为Laravel不是以此方式设计的。您最好在模型之外执行相同的操作。此外,此代码还有另一个问题,如果找不到该对象,我们将对$primaryKey = 1
进行硬编码。这样的硬编码值有时可能会有风险。
答案 1 :(得分:0)
不要这样做。口才不是这样设计的。像这样重写构造函数必然会在以后引起很多问题。
考虑为您的用例添加静态方法-类似于上述Imran的解决方案。这样,您就可以享受自己所追求的奇特行为,而不必冒险破坏其他任何事物。
答案 2 :(得分:0)
您可以获得的最接近的解决方案是使用findOrNew()函数https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Builder.html#method_findOrNew。
您可以将其用作
$character = Character::findOrNew(1);
这将在字符表中查询ID 1,并返回Character模型的实例,如果在数据库中找不到ID,则将实例化并返回Character模型的新实例。但是,没有设置模型ID的选项。