PHP: Slim Framework/Eloquent ORM 批量分配错误
PHP: Slim Framework/Eloquent ORM mass assignment error
我在 laravel 之外使用带有 slim 框架的 eloquent,我有控制器可以帮助执行 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))
下面是我的控制器和型号:
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
下面是我的用户模型
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();
}
}
我多次检查了我的代码,但没有发现问题所在,但它抛出了约束冲突错误。这是 eloquent 的错误还是我做错了什么。
看来问题出在您的 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
class' create
方法。除了您想关注的代码行,我删除了所有代码:
public function create(array $attributes)
{
...
$instance = $this->related->newInstance($attributes);
...
}
这基本上是创建模型的新实例并传入属性数组。本质上是这样的:
new Emoji([
'name' => $data['name'],
'char' => $data['char'],
'category' => $data['category'],
]);
但是,您的构造函数不接受像 Laravel 的模型那样的属性数组,这会改变模型的实际行为。这些值未被填充。顶部的解决方案应该可以解决您的问题。加载环境变量后,它会延迟回 Laravel 的默认行为。
我在 laravel 之外使用带有 slim 框架的 eloquent,我有控制器可以帮助执行 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))
下面是我的控制器和型号:
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
下面是我的用户模型
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();
}
}
我多次检查了我的代码,但没有发现问题所在,但它抛出了约束冲突错误。这是 eloquent 的错误还是我做错了什么。
看来问题出在您的 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
class' create
方法。除了您想关注的代码行,我删除了所有代码:
public function create(array $attributes)
{
...
$instance = $this->related->newInstance($attributes);
...
}
这基本上是创建模型的新实例并传入属性数组。本质上是这样的:
new Emoji([
'name' => $data['name'],
'char' => $data['char'],
'category' => $data['category'],
]);
但是,您的构造函数不接受像 Laravel 的模型那样的属性数组,这会改变模型的实际行为。这些值未被填充。顶部的解决方案应该可以解决您的问题。加载环境变量后,它会延迟回 Laravel 的默认行为。