Я новичок в 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);
0
smchae 2 Янв 2018 в 05:24

2 ответа

Лучший ответ

Вы передаете только один параметр функции конструктора, но она ожидает 2 параметра. Итак, либо передайте два параметра, либо сделайте конструктор следующим образом:

public function __construct($table = null, $attr = [])
{
    $this->setTable($table);
    parent::__construct($attributes);
}

Но я не понимаю, зачем вы это делаете? Стандартная практика - создавать по одной модели для каждой таблицы. Вы тоже должны это сделать.

3
Nuruzzaman Milon 2 Янв 2018 в 04:04

Не существует метода 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';
}
0
sisve 2 Янв 2018 в 07:23