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

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年11月23日 星期四

array_filter的注意事項

        今天前端回報一個api的型別問題,發現有一個應該要return array的卻return成object了,
只有array型別是associative array的時候才會return成object,也就是一個key對一個value,但是之前寫的程式沒有任何key的設定,最後發現是array_filter的坑。

        以下是程式碼:

$ary = [1, 2, 3, 4, 5];

$ary = array_filter($ary, function($v) {
    return $v != 3;
});

echo json_encode($ary);

        當$content進入到array_filter之後,array_filter把不符合label的刪除,但同時也會幫你保留keys值的相對位置,進而把你的array變成associative array。

        也就是說結果變成:{"0":1,"1":2,"3":4,"4":5} 。

        所以這裡我們必須對array_filter產出的結果在處理一次:

$ary = [1, 2, 3, 4, 5];

$ary = array_filter($ary, function($v) {
    return $v != 3;
});

$ary = array_values($ary);

echo json_encode($ary);

        用array_values重新轉換成sequential array就行了。

        結果回到我們預想中的:[1,2,4,5]。


        參考資料: