在new()中传递主键时,在Laravel中加载模型对象

时间:2019-04-29 01:45:54

标签: laravel eloquent model

我开始尝试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已经这样做了,而我只是想念些什么?

3 个答案:

答案 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的选项。