2015-11-03 74 views
1

我正在使用Laravel 5.1。 我做了我的路線規則。 「/ post/{id}」 和帖子將使用此代碼返回。laravel mysql忽略號碼後的字母

Post::find($id); 

是啊!有用。

但我只是想知道它是否適用於非數字或非數字。 (例如:1dssadf)所以我簡化了代碼。

Post::find('1dssadf'); 

(有一個帖子ID 1)

我例外錯誤。但它的作品。它發現了一個帖子ID爲1.(忽略dssadf

爲什麼'1dssadf'被視爲'1'?

+2

如果需要數字,相關轉換將自動進行。這對於我已經使用的大多數(?)語言來說是非常標準的(或者將會是編譯器/解釋器選項),我一直認爲它是允許的,以便單元等(例如10km,15%,12oz)不改變串。 – Giles

回答

4

這是一個ID,所以它被轉換爲相關的。

您可以

echo (int) "1dssadf"; 

=> 1

MySQL的等效試驗:

SELECT CAST('1dssadf' AS UNSIGNED) 

=> 1種

+0

謝謝。這是真的! – ryush00

+3

這發生在'mySql'而不是'Laravel'中。 –

+0

這是讓他明白的例子。我修改以反映您的評論。 –

1

思維,接受的答案是 「不完整的」。它的顯然轉換髮生 - 如果它工作並返回一些結果。實際上,Eloquent不會將傳遞的值從字符串轉換爲int。您可以在下次\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php看到:

/** 
* Find a model by its primary key. 
* 
* @param mixed $id 
* @param array $columns 
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|null 
*/ 
public function find($id, $columns = ['*']) 
{ 
    if (is_array($id)) { 
     return $this->findMany($id, $columns); 
    } 

    $this->query->where($this->model->getQualifiedKeyName(), '=', $id); 
    return $this->first($columns); 
} 

生成器只是增加了在那裏條件與目前的主鍵的名稱。然後它(建設者)編譯所有參數/條件/等。準備好聲明並優化它。在你的情況下,它將是select * from posts where posts.id = ? limit 1$bindings陣列[0 => "1dssadf"]。你可以看到這一刻在\vendor\laravel\framework\src\Illuminate\Database\Connection.php(方法select)。最後,答案是MySQL認識到id應該是一個整數(INT),並自動將字符串「1dssadf」轉換爲整數1(內置行爲),不需要任何(int)...CAST(..)