顯示具有 laravel 標籤的文章。 顯示所有文章
顯示具有 laravel 標籤的文章。 顯示所有文章

2017年12月5日 星期二

laravel binding database config 機制

        今天需要在一個地方連續切換資料庫,所以連帶的也要設定database config,但發生db table not found的狀況,dd了config發現沒有設定錯誤。

        查了stackoverflow才知道,laravel似乎有個binding的機制,如果基於一開始的config建立連線,那這個連線就會持續存在,之後不管是eloquent還是db connection都會基於這個連線運行sql,即使之後調整了config也一樣:

$page = Page::find(1);

// 設定另外一個config
config([
    'database.connections.mysql.host' => $hostname,
    'database.connections.mysql.username' => $username,
    'database.connections.mysql.password' => $password,
    'database.connections.mysql.database' => $database,
    'database.connections.mysql.charset' => $char_set
]);

// 原本的db沒有orders table,發生錯誤
$order = Order::find(1);

        這裡的解決方式:

$page = Page::find(1);

// disconnect 連線
DB::disconnect('mysql');

// 設定另外一個config
config([
    'database.connections.mysql.host' => $hostname,
    'database.connections.mysql.username' => $username,
    'database.connections.mysql.password' => $password,
    'database.connections.mysql.database' => $database,
    'database.connections.mysql.charset' => $char_set
]);

// 原本的db沒有orders table,發生錯誤
$order = Order::find(1);

        這樣一來就會連接到之後設定的config了。


參考資料:

https://stackoverflow.com/questions/35466362/laravel-5-changing-database-name-in-runtime

2017年2月5日 星期日

laravel 1071 Specified key was too long; max key length is 767 bytes 解決方法

        laravel new 一個新專案之後,在.env用好資料庫設定,接著執行php artisan migrate的時候,拋出了兩個例外:

  [Illuminate\Database\QueryException]                                                                                                                                                 
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))  
                                                                                                                 
  [PDOException]                                                                                                   
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes  

        可以看到共通點就是Specified key was too long; max key length is 767 bytes。

        因為laravel5.4用的是utf8mb4編碼,這種編碼跟默認的uft8編碼差別就在於utf8編碼最多支援到3個字節,而utf8mb4可以支援到四個字節,所以utf8mb4可以支援四個字節的emojis儲存進資料庫,mb4指的就是「most bytes 4」,而utf8mb4同時也支援許多的漢語難字。

        但在5.7.7之前的Mysql版本,以及10.2.2之前的MariaDB版本必須要手動調整預設的字串長度讓MySQL可以為他們新增索引。

        實際做法是在AppServiceProvider.php裡面加兩行程式碼:

<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

// 1
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // 2
        Schema::defaultStringLength(191);
    }

    /**     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //    
    }
}

        引入Schema之後再去呼叫defaultStringLength去更改預設字串長度就行了。


參考資料:


2016年8月1日 星期一

Laravel 5.2 Basic Task List : sqlstate[Hy000] [2002] Connection refused

        一開始遇到一個問題:

git clone https://github.com/laravel/quickstart-basic quickstart
cd quickstart
composer install
php artisan migrate
官網上的Document,要執行php artisan migrate 時,卻發生了這樣的錯誤



看了一下.env(在quickstart的第一層目錄),發現原本的設定是:

DB_HOST=127.0.0.1
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

原來是官方的範例或直接使用Laravel new 的command,都假設我們在Homestead上開發Laravel,所以DB也是如此設定

我們只要改成

DB_HOST=127.0.0.1:8889      ( 根據自己的port )
DB_DATABASE= database name  (建立一個本機端的database)
DB_USERNAME=  your username
DB_PASSWORD=  your password

這樣就OK了!


來研究一下migration是什麼....