Laravel создать базу данных из модели - PullRequest
0 голосов
/ 03 июля 2018

Я использую существующий проект Laravel, и у этого уже есть модели, вот пример одного из них:

<?php

/**
 * Created by Reliese Model.
 * Date: Fri, 20 Apr 2018 08:56:36 +0000.
 */

namespace App\Models;

use Reliese\Database\Eloquent\Model as Eloquent;

/**
 * Class PdTcountry
 * 
 * @property int $pkcountry
 * @property string $country_code
 * @property string $country_name
 * @property string $country_localName
 * @property string $country_webCode
 * @property string $country_region
 * @property string $country_continent
 * @property float $country_latitude
 * @property float $country_longitude
 * @property string $country_surfaceArea
 * @property string $country_population
 * @property string $country_postcodeexpression
 * @property \Carbon\Carbon $create_at
 * @property \Carbon\Carbon $update_at
 * 
 * @property \Illuminate\Database\Eloquent\Collection $pd_tregions
 *
 * @package App\Models
 */
class PdTcountry extends Eloquent
{
    protected $table = 'pd_tcountry';
    protected $primaryKey = 'pkcountry';
    public $timestamps = false;

    protected $casts = [
        'country_latitude' => 'float',
        'country_longitude' => 'float'
    ];

    protected $dates = [
        'create_at',
        'update_at'
    ];

    protected $fillable = [
        'country_code',
        'country_name',
        'country_localName',
        'country_webCode',
        'country_region',
        'country_continent',
        'country_latitude',
        'country_longitude',
        'country_surfaceArea',
        'country_population',
        'country_postcodeexpression',
        'create_at',
        'update_at'
    ];

    public function pd_tregions()
    {
        return $this->hasMany(\App\Models\PdTregion::class, 'fkcountry');
    }
}

У меня такой вопрос: с помощью этой модели через php artisan можно создать таблицу базы данных из модели? Если есть команда php artisan, которая сделает это для всех моих моделей, это будет супер.

В моей папке с базой данных они есть, но я не знаю, что они делают.

enter image description here

Ответы [ 5 ]

0 голосов
/ 11 июля 2018

Вот пакет компоновщика, который вы можете установить, который создает таблицы базы данных из ваших моделей. Это называется reliese.

https://github.com/reliese/laravel

Надеюсь, это поможет и то, что вы ищете.

0 голосов
/ 11 июля 2018

Как уже отмечали другие: это не то, как работает Laravel или, если быть точным, Eloquent ORM. Обычно вы сначала создаете таблицу (т.е. выполняете миграцию), а затем создаете свою модель. Много времени можно сэкономить, придерживаясь Laravels условных обозначений .

Однако у вас уже есть одна или несколько моделей, в которых отсутствует миграция. Я бы посоветовал вам просто добавить миграции для этих моделей. К сожалению, это будет большая работа, если у вас много моделей и, особенно (как в случае с примером модели), когда вы не придерживались имени таблицы и других соглашений.

С другой стороны, у вас уже есть много информации, которая будет включена в вашу миграцию, доступной в вашей модели. Вы можете извлечь эту информацию из DocComments и свойств, таких как $table, $primaryKey, $fillable и т. Д. Это можно сделать автоматически. Я собрал пример, который далек от завершения, но, по крайней мере, должен помочь вам начать с основы вашей миграции. Затем вы можете решить сделать оставшиеся части вручную или добавить функциональность в автоматический процесс. Я бы лично сделал последнее, если бы у меня было много моделей.


Пример

Я основал этот пример модели, включенной в ваш вопрос.

Как я уже сказал; это далеко от завершения, на ум приходят следующие дополнения / улучшения:

  1. Определите отношения и основывайте внешние ключи на этом. (Взгляните на этот пост , чтобы получить вдохновение.)
  2. Добавить больше типов данных к switch.
  3. ...

Сохранить следующую черту как 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();


    }
}
0 голосов
/ 06 июля 2018

Запустите php artisan migrate в консоли. Это создаст таблицы для определения, существующие в вашей папке database/migrations, как показано на рисунке в вопросе.

0 голосов
/ 09 июля 2018

Есть ли способ через php artisan создать таблицу базы данных из модели?

Звучит так, как будто вы хотите "Code-First Design". Это поддерживается в Entity Framework от Microsoft, однако в Laravel способ работы несколько отличается. В C # с платформой Entity можно было бы создать свойства (в основном методы-получатели), соответствующие каждому столбцу базы данных. С Eloquent (библиотека Laravel ORM ) он генерирует их динамически, используя магические методы PHP , переменные PHP также не имеют типов, как в C #. Из-за этого нет способа заполнить базу данных на основе кода так, как вы хотите. Комментарии к документу, которые вы разместили в своем вопросе, выглядят так, как будто они были сгенерированы наоборот из базы данных в код с использованием пакета laravel-ide-helper .

В качестве альтернативы некоторые клиенты баз данных, такие как Sequel Pro , имеют плагин для экспорта существующей схемы базы данных в миграцию Laravel, которую я нашел очень быстрой и полезной в прошлом, и, возможно, это самая близкая вещь, к которой вы можете добраться рабочий процесс, который вы ищете. Удачи!

Exporting a database schema as a Laravel migration

У меня (набор файлов миграции) в папке базы данных, но я не знаю, что они делают.

Вам следует ознакомиться с соответствующей документацией на веб-сайте Laravel . Миграции уже созданы, поэтому вам необходимо настроить локальную базу данных и выполнить команду migrate. Это создаст таблицы и столбцы, необходимые для вашего приложения. Когда вы вносите изменения в схему, вы должны добавить больше миграций и повторно запустить команду migrate.

php artisan migrate
0 голосов
/ 06 июля 2018

Если вы хотите сгенерировать эти таблицы автоматически, то нет, у Laravel действительно нет способа сделать это. Теоретически вы можете написать свою собственную команду для генерации файлов миграции для каждой из ваших моделей, но вам все равно потребуется указать все имена столбцов, типы данных и т. Д. Взгляните, например, на команду Laravel make:migration. Он просто использует заглушки и заменяет ключевые слова при генерации (vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php). Если у вас есть тонна моделей, которым нужны таблицы базы данных, то, возможно, это будет хорошим подходом для вас.

Если нет, однако, вам лучше всего сгенерировать миграцию с помощью стандартной команды и просто снабдить ее тегом --create. После этого вам просто нужно будет определить таблицу в вашей модели (или использовать соглашение об именах, чтобы оно автоматически находило ее, см. https://laravel.com/docs/5.6/eloquent#defining-models для получения дополнительной информации об соглашениях об именах).

Пример:

php artisan make:migration create_my_model_table --create=my_model_table_name

Если вы не используете соглашение об именах, добавьте имя вашей таблицы к вашей модели:

class PdTcountry extends Eloquent {

    protected $table = "my_model_table_name"

    ...
}
...