Как уже отмечали другие: это не то, как работает Laravel или, если быть точным, Eloquent ORM. Обычно вы сначала создаете таблицу (т.е. выполняете миграцию), а затем создаете свою модель. Много времени можно сэкономить, придерживаясь Laravels условных обозначений .
Однако у вас уже есть одна или несколько моделей, в которых отсутствует миграция. Я бы посоветовал вам просто добавить миграции для этих моделей. К сожалению, это будет большая работа, если у вас много моделей и, особенно (как в случае с примером модели), когда вы не придерживались имени таблицы и других соглашений.
С другой стороны, у вас уже есть много информации, которая будет включена в вашу миграцию, доступной в вашей модели. Вы можете извлечь эту информацию из DocComments и свойств, таких как $table
, $primaryKey
, $fillable
и т. Д. Это можно сделать автоматически. Я собрал пример, который далек от завершения, но, по крайней мере, должен помочь вам начать с основы вашей миграции. Затем вы можете решить сделать оставшиеся части вручную или добавить функциональность в автоматический процесс. Я бы лично сделал последнее, если бы у меня было много моделей.
Пример
Я основал этот пример модели, включенной в ваш вопрос.
Как я уже сказал; это далеко от завершения, на ум приходят следующие дополнения / улучшения:
- Определите отношения и основывайте внешние ключи на этом. (Взгляните на этот пост , чтобы получить вдохновение.)
- Добавить больше типов данных к
switch
.
- ...
Сохранить следующую черту как app/SchemaBuilder.php
:
<code><?php
namespace App;
trait SchemaBuilder
{
public function printMigration()
{
echo '<pre>';
echo htmlspecialchars($this->generateMigration());
echo '
';
}
публичная функция makeMigrationFile ()
{
if ($ this- >igrationFileExists ()) {
die ('Похоже, что миграция для этой модели уже существует. Пожалуйста, проверьте это.');
}
$ filename = date ('Y_m_t_His'). '_Создайте_' . $ this-> table. '_Table.php';
if (file_put_contents (database_path ('migrations /'). $ filename, $ this-> generateMigration ())) {
вернуть истину;
}
вернуть ложь;
}
защищенная функция generateMigration ()
{
вернуть sprintf ($ this-> getSchemaTemplate (),
ucfirst ($ this-> table), $ this-> table,
implode ("\ n \ t \ t \ t", $ this-> generateFieldCreationFunctions ()),
$ This-> стол
);
}
защищенная функция getSchemaTemplate ()
{
$ schema = "<? php \ n";
$ schema. = "\ n";
$ schema. = "use Illuminate \\ Support \\ Facades \\ Schema; \ n";
$ schema. = "use Illuminate \\ Database \\ Schema \\ Blueprint; \ n";
$ schema. = "use Illuminate \\ Database \\ Migrations \\ Migration; \ n";
$ schema. = "\ n";
$ schema. = "class Create% sTable extends Migration \ n";
$ schema. = "{\ n";
$ schema. = "\ t / ** \ n";
$ schema. = "\ t * Запустить миграцию. \ n";
$ schema. = "\ t * \ n";
$ schema. = "\ t * @return void \ n";
$ schema. = "\ t * / \ n";
$ schema. = "\ tpublic function up () \ n";
$ schema. = "\ t {\ n";
$ schema. = "\ t \ tSchema :: create ('% s', function (Blueprint \ $ table) {\ n";
$ schema. = "\ t \ t \ t% s \ n"; # Актуальные поля базы данных будут добавлены здесь.
$ schema. = "\ t \ t}); \ n";
$ schema. = "\ t} \ n";
$ schema. = "\ n";
$ schema. = "\ t / ** \ n";
$ schema. = "\ t * Обратный перенос. \ n";
$ schema. = "\ t * \ n";
$ schema. = "\ t * @return void \ n";
$ schema. = "\ t * / \ n";
$ schema. = "\ tpublic function down () \ n";
$ schema. = "\ t {\ n";
$ schema. = "\ t \ tSchema :: drop ('% s'); \ n";
$ schema. = "\ t} \ n";
$ schema. = "}";
вернуть схему $;
}
защищенная функция generateFieldCreationFunctions ()
{
$ functions = [];
if (isset ($ this-> primaryKey)) {
$ functions [] = "\ $ table-> increments ('$ this-> primaryKey');";
}
$ featuresFromDoc = $ this-> extractFieldDataFromCommentDoc ();$ functions [] = ""; Взломать наш путь к пустой строке.
foreach ($ this-> fillable как $ fillableField) {
if (in_array ($ fillableField, $ this-> date)) {# Мы будем обрабатывать поля в $ date позже.
Продолжить;
}
if (! isset ($ featuresFromDoc [$ fillableField])) {
$ functions [] = "// Вручную что-то сделать с $ fillableField";
}
switch ($ featuresFromDoc [$ fillableField]) {
case 'string':
$ functions [] = "\ $ table-> string ('$ fillableField'); // TODO: проверить, является ли varchar правильным типом поля.";
перерыв;
case 'int':
$ functions [] = "\ $ table-> integer ('$ fillableField'); // TODO: проверить, является ли целое число правильным типом поля.";
перерыв;
case 'float':
$ functions [] = "\ $ table-> float ('$ fillableField', 12, 10);";
перерыв;
дефолт:
$ functions [] = "// Вручную что-то сделать с $ fillableField";
}
}
$ functions [] = ""; # Пустая строка.
foreach ($ this-> date как $ dateField) {
$ functions [] = "\ $ table-> dateTime ('$ dateField');";
}
$ functions [] = ""; # Пустая строка.
if (! empty ($ this-> timestamps)) {
$ functions [] = "\ $ table-> timestamps ();";
}
вернуть $ функции;
}
защищенная функция extractFieldDataFromCommentDoc ()
{
$ doc_comment = (new \ ReflectionClass (get_parent_class ($ this))) -> getDocComment ();
preg_match_all ('/ @ свойство (. +) \ $ (. +) /', $ doc_comment, $ совпадений, PREG_SET_ORDER);
foreach ($ match как $ match) {
$ features [$ match [2]] = $ match [1];
}
вернуть $ особенности;
}
защищенная функция migrationFileExists ()
{
$ path = database_path ('migrations');
if ($ handle = opendir ($ path)) {
while (false! == ($ file = readdir ($ handle))) {
if (strpos ($ file, 'create_'. $ this-> table. '_table')! == false) {
вернуть истину;
}
}
closedir ($ ручка);
}
вернуть ложь;
}
}
Создайте следующий контроллер и зарегистрируйте маршрут, чтобы вы могли получить к нему доступ:
<?php
namespace App\Http\Controllers;
use App\PdTcountry;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function index()
{
# Specify for which model you'd like to build a migration.
$buildSchemaFor = 'App\PdTcountry';
eval(sprintf('class MigrationBuilder extends %s{use \App\SchemaBuilder;}', $buildSchemaFor));
if ((new \MigrationBuilder)->makeMigrationFile()) {
echo 'Migration file successfully created.';
}
else {
echo 'Encountered error while making migration file.';
}
# Or alternatively, print the migration file to the browser:
// (new \MigrationBuilder)->printMigration();
}
}