Я новичок в laravel. Я хочу изменить имя таблицы на заданную строку в конструкторе модели. Приведенный ниже код - это то, что я пробовал, но, похоже, он не работает.
Любые предложения или советы будут оценены.
Спасибо
Модель
class Custom extends Model
{
protected $guarded = ['id', 'ct'];
const UPDATED_AT = null;
const CREATED_AT = 'ct';
public function __construct(array $attributes = [], string $tableName = null) {
parent::__construct($attributes);
$this->setTable($tableName);
}
}
Контроллер
$tableName = 'some string';
$custom = new Custom([], $tableName);
$result = $custom->create($data);
2 ответа
Вы передаете только один параметр функции конструктора, но она ожидает 2 параметра. Итак, либо передайте два параметра, либо сделайте конструктор следующим образом:
public function __construct($table = null, $attr = [])
{
$this->setTable($table);
parent::__construct($attributes);
}
Но я не понимаю, зачем вы это делаете? Стандартная практика - создавать по одной модели для каждой таблицы. Вы тоже должны это сделать.
Не существует метода Model :: create. Это волшебные махинации с помощью noreferrerollow="norefrererollow="noreferred/Model.php#L1464> __call. Вызов $custom->create(...)
перенаправит вызов на Builder :: create, который вызывает Builder :: newModelInstance, который, в свою очередь, вызывает Model :: newInstance. Этот код вообще ничего не знает об исходной модели, он знает только об атрибутах $data
. (Обычно он вызывается в статическом контексте, например Model::create(...)
, без экземпляра источника.)
Самый простой обходной путь для вас - создать новый класс, производный от Custom, и объявить в нем свойство $ table. Для этого потребуется одна модель на стол.
class Custom2 extends Custom {
public $table = 'some string';
}
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.