Laravel - Model :: create () работает, но отсутствуют атрибуты - PullRequest
1 голос
/ 25 марта 2020

Итак, у меня есть следующие модели:

class Recursive extends Model {
  public function __construct() {
    parent::__construct();
  }
  // ...
}

class Place extends Recursive {
   protected $table = 'places';
   protected $fillable = ['name', 'parent_id'];
   // ...
}

Следующий код используется для создания нового Place:

$place = Place::create([
  'name' = 'Second',
  'parent_id' => 1
]);

Это приводит к следующей записи в база данных:

| Actual                    | Expected                  |
---------------------------------------------------------
| id | name     | parent_id | id | name     | parent_id | 
| 1  | 'Top'    | NULL      | 1  | 'Top'    | NULL      |
| 2  | NULL     | NULL      | 2  | 'Second' | 1         |

Как видите, единственное установленное значение - это автоинкрементный столбец id. 2 столбца, которые я пытаюсь создать, находятся в массиве fillable, и модель создана, но она не связана правильно.

Кто-нибудь сталкивался с этой проблемой раньше? Я знаю, что могу использовать другой метод, например

$place = new Place();
$place->name = 'Second';
$place->parent_id = 1;
$place->save();

Но это не единственное место, где я использую этот код, и я бы предпочел не терять такую ​​функциональность, как эта.

Редактировать: при включении журнала запросов для вызова create() отображается следующее:

array (
  'query' => 'insert into `places` () values ()',
  'bindings' => 
  array (
  ),
  'time' => 1.26,
),

Дальнейшее редактирование: Включить MySQL Журнал имеет тот же вывод, что и выше. Следуя предложению Miken32 о возврате extends в Model, работает как ожидалось:

array (
  'query' => 'insert into `places` (`name`, `parent_id`) values (?, ?)',
  'bindings' => 
  array (
    0 => 'Second',
    1 => '1'
  ),
  'time' => 1.21,
),

1 Ответ

2 голосов
/ 26 марта 2020

При проверке класса Illuminate\Database\Eloquent\Model конструктор выглядит следующим образом:

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

Однако вы переопределили это в вашем Recursive классе:

public function __construct()
{
    parent::__construct();
}

Атрибуты не были передается в конструктор, поэтому он не смог успешно построить запрос. Вы можете удалить конструктор, поскольку он ничего не делает, или использовать вместо этого:

public function __construct(array $attributes = [])
{
    parent::__construct($attributes);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...