PHP:Slim Framework/Eloquent ORM批量分配错误


PHP: Slim Framework/Eloquent ORM mass assignment error

我在laravel之外使用了一个有说服力的瘦框架,我有一些控制器可以帮助执行CRUD操作。当我尝试执行批量分配操作时,Eloquent抛出一个错误,说:

SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed:
 emoji.name (SQL: insert into "emoji" ("user_id", "updated_at", "created_at") 
values (1, 2016-01-02 02:56:43, 2016-01-02 02:56:43))

Bellow是我的控制器,型号:

public function create(ServerRequestInterface $request, ResponseInterface $response)
{
    $data   =   $request->getParsedBody();
    $uid    =   $data['uid'];
    $keywords   =   $data['keywords'];
    $body   =   $response->getBody();
        $user   =   User::find($uid);
        $user->emojis()->create([
            'name'  =>  $data['name'],
            'char'  =>  $data['char'],
            'category'  =>  $data['category'],
        ]);
//            $emoji = new Emoji();
//            $emoji->name  =  $data['name'];
//            $emoji->char  =  $data['char'];
//            $emoji->category  =  $data['category'];
//            $emoji->save();
        return $response;
    }

当我使用上面评论的行,而不是其他行时,该应用程序可以工作:

我的型号如下:

namespace BB8'Emoji'Models;
use BB8'Emoji'Models'BaseModel;
class Emoji  extends BaseModel
{
    protected $table    = 'emoji';
    protected $dates    = ['created_at', 'updated_at', 'deleted_at'];
    protected $fillable = array('name', 'char', 'category', 'created_at', 'updated_at', 'user_id');
public function user()
{
    return $this->belongsTo("BB8'Emoji'Models'User");
}
public function keywords()
{
    return $this->hasMany("BB8'Emoji'Models'EmojiKeyword");
}
}

当我var_dump($data)时,我得到以下信息:

array (size=6)
  'name' => string 'Happy Face' (length=10)
  'char' => string ')' (length=1)
  'keywords' => 
    array (size=1)
      0 => string 'happy' (length=5)
  'category' => string 'Happy' (length=5)
  'created_by' => int 1
  'uid' => int 1

下面是我的UserModel

namespace BB8'Emoji'Models;
use BB8'Emoji'Models'BaseModel;
class User extends BaseModel
{
public $timestamps = false;
protected $fillable = ['username', 'password', 'jit'];
public function emojis()
{
    return $this->hasMany('BB8'Emoji'Models'Emoji');
}
public static function auth($username, $password)
{
    $user       =   static::where('username', '=', $username)->first();
    if (isset($user->exists) && $user->exists) {
        if (strcmp(hash('sha256', $password), $user->password) == 0) {
            return $user;
        }
    }
    return false;
}

  public static function isAuthenticated($token)
    {
    }
  }

BaseModel.php:

 namespace BB8'Emoji'Models;
use BB8'Emoji'Database'Connection;
class BaseModel extends 'Illuminate'Database'Eloquent'Model
{
    public function __construct()
    {
        $dotenv = new 'Dotenv'Dotenv(__DIR__.'/../../');
        $dotenv->load();
    }
}

我已经多次检查了我的代码,但没有发现问题所在,但它抛出了违反约束的错误。这是一个能说会道的bug,还是我做错了什么。

看起来问题出在您的BaseModel上。尝试将您的构造函数更改为:

public function __construct(array $attributes = [])
{
    $dotenv = new 'Dotenv'Dotenv(__DIR__.'/../../');
    $dotenv->load();
    parent::__construct($attributes);
}

说明:

这是Laravel的原始模型的构造函数。

public function __construct(array $attributes = [])
{
    $this->bootIfNotBooted();
    $this->syncOriginal();
    $this->fill($attributes);
}

它接受一个属性数组,并用它做一些事情,但要记住fill方法。

现在,以下是您正在做的创建您的表情符号:

$user->emojis()->create([
    'name'  =>  $data['name'],
    'char'  =>  $data['char'],
    'category'  =>  $data['category'],
]);

这将调用HasMany类的create方法。我删除了除了你想关注的代码行之外的所有代码:

public function create(array $attributes)
{
    ...
    $instance = $this->related->newInstance($attributes);
    ...
}

这基本上创建了模型的一个新实例,并传递属性数组。本质上是这样的:

new Emoji([
    'name'  =>  $data['name'],
    'char'  =>  $data['char'],
    'category'  =>  $data['category'],
]);

然而,您的构造函数不接受像Laravel模型那样的属性数组,这会改变模型的实际行为。值未填充。顶部的解决方案应该可以解决你的问题。在您加载环境变量之后,它只是回到Laravel的默认行为。