laravel — PHP: ошибка массового назначения Slim Framework / Eloquent ORM

Я использую eloquent с тонким фреймворком вне 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))

Сильфон мой контроллер и модель:

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();
}
}

Я несколько раз проверил мой код, не видя, что не так, но он выдает ошибку нарушения ограничения. Это ошибка с Eloquent или я делаю что-то не так.

3

Решение

Выглядит как твой 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 по умолчанию.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]