{"id":482,"date":"2024-08-08T09:08:53","date_gmt":"2024-08-08T13:08:53","guid":{"rendered":"https:\/\/waterloobae.com\/?p=482"},"modified":"2025-08-20T14:29:10","modified_gmt":"2025-08-20T18:29:10","slug":"laravel-starting-laravel-project-with-existing-db-schema","status":"publish","type":"post","link":"https:\/\/waterloobae.com\/blog\/2024\/08\/08\/laravel-starting-laravel-project-with-existing-db-schema\/","title":{"rendered":"[Laravel] Starting Laravel Project with existing DB\/Schema"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">DB Settings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After creating Laravel project with Composer, you need to modify two files to set DB environment.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\/.env will have multiple DB setting as below or similar. On the example below show two schema of sigma and cms.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">DB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE1=mysql1\nDB_USERNAME1=user1\nDB_PASSWORD1=password1\nDB_DATABASE2=mysql2\nDB_USERNAME1=user2\nDB_PASSWORD1=password2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\/config\/database.php defines connections with environmental variables sourced from .env file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">'mysql1' =&gt; [\n    'driver' =&gt; 'mysql',\n    ...\n    'host' =&gt; env('DB_HOST', '127.0.0.1'),\n    'username' =&gt; env('DB_USERNAME1','root'),\n    ...\n],\n'mysql2' =&gt; {\n    'driver' =&gt; 'mysql',\n    ...\n    'host' =&gt; env('DB_HOST', '127.0.0.1'),\n    'username' =&gt; env('DB_USERNAME1','root'),\n    ...\n],<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2018mysql1\u2019 connection has setting for connecting to \u2018mysql1\u2019 schema. \u2018mysql2\u2019 connection has setting for connecting to \u2018mysql2\u2019 schema. Now, your Laravel project is ready to connect to defined DBs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Generating-Migrates\">Generating Migrates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Install Laravel Schema package to generate migrates as below.<code><\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>composer require --dev \"kitloong\/laravel-migrations-generator\"<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The detailed instructions for this package can be found from <a href=\"https:\/\/github.com\/kitloong\/laravel-migrations-generator\">https:\/\/github.com\/kitloong\/laravel-migrations-generator<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then, you can generate migrate for each DB or connection.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>php artisan migrate:generate --connection=\"mysql1\"<\/code>\n<code>php artisan migrate:generate --connection=\"mysql2\"<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Migrates will be generated \/database\/migration\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Those migrates are no use for now to be precise. They will be useful when we need to change tables and\/or columns. It will keep history of changes for DB.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Creating-Models\">Creating Models<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, you will create models for every table. I am planing to automate this by creating composer package. For now, you can create each model as below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>php artisan make:model School -a<\/code>\n<code>php artisan make:model msContest -a<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2018-a\u2019 options will create all of related class like Factory, Migration, Seeder, Request, Controller and Policy. Details are available on <a href=\"https:\/\/laravel.com\/docs\/11.x\/eloquent#generating-model-classes\">https:\/\/laravel.com\/docs\/11.x\/eloquent#generating-model-classes<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Model class can be found in \/app\/Models. You may add connection and table name as below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass School extends Model\n{\n    use HasFactory;\n    protected $connection = 'mysql';\n    protected $table = 's_school';\n\n    protected $fillable = ['name', 'email', 'school_number'];\n\n}<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">\/app\/Models\/School.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass msContest extends Model\n{\n    use HasFactory;\n    protected $connection = 'cms';\n    protected $table = 'ms_contest';\n\n    protected $fillable = ['contest_event', 'contest_name', 'contest_year'];\n\n\n}<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">\/app\/Models\/msContest.php<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Testing-Models\">Testing Models<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It is easy to dump responses on the root route to see if values are retrieved from DB. During development, you can dump them on your View or somewhere else. Here is the laziest way to do this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can open web.php page in \/routes directory that stores all of web routes. Change route for &#8216;\/&#8217; and dump variable there. Do not forget including two Models<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nuse App\\Http\\Controllers\\ProfileController;\nuse App\\Models\\msContest;\nuse Illuminate\\Support\\Facades\\Route;\nuse App\\Models\\School;\n\n\/\/ Route::get('\/', function () {\n\/\/     return view('welcome');\n\/\/ });\n\nRoute::get('\/', function () {\n    $contests = msContest::take(10)-&gt;get();\n    dd($contests);\n    \n    \/\/$schools = School::take(10)-&gt;get();\n    \/\/dd($schools);\n    \/\/return \"&lt;h1&gt;Hello there!&lt;\/h&gt;\";\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will see data from web site<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"533\" height=\"401\" src=\"https:\/\/waterloobae.com\/wp-content\/uploads\/2024\/08\/image.png\" alt=\"\" class=\"wp-image-483\" srcset=\"https:\/\/waterloobae.com\/wp-content\/uploads\/2024\/08\/image.png 533w, https:\/\/waterloobae.com\/wp-content\/uploads\/2024\/08\/image-300x226.png 300w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>DB Settings After creating Laravel project with Composer, you need to modify two files to set DB environment. \/config\/database.php defines connections with environmental variables sourced from .env file. \u2018mysql1\u2019 connection has setting for connecting to \u2018mysql1\u2019 schema. \u2018mysql2\u2019 connection has setting for connecting to \u2018mysql2\u2019 schema. Now, your Laravel project is ready to connect to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,14],"tags":[],"class_list":["post-482","post","type-post","status-publish","format-standard","hentry","category-it-tips","category-laravel"],"_links":{"self":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts\/482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/comments?post=482"}],"version-history":[{"count":5,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts\/482\/revisions"}],"predecessor-version":[{"id":861,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts\/482\/revisions\/861"}],"wp:attachment":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/media?parent=482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/categories?post=482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/tags?post=482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}