2015-06-25 71 views
1

即時通訊可能只是不正確的想法,但這裏是我的問題: 我試圖通過建立一個簡單的待辦事項應用程序學習laravel。Findorfail在Laravel不工作

我有一個模型名稱待辦事項。

> <?php 
> 
> namespace App; 
> 
> use Illuminate\Database\Eloquent\Model; 
> 
> class todo extends Model { 
> 
> 
> 
> } 

我的路線:

Route::get('todo', '[email protected]'); 

Route::get('/todo/{id}','[email protected]'); 

而且我的控制器:

public function index() 
    { 
     $todo = DB::table('todo')->get(); 
     return view('pages.todo')->with('todo',$todo); 


    } 

    public function show($id) 
    { 
     $dos = todo::findOrFail($id); 
     return ($dos); 

    } 

索引方法的工作。 但show()給了我一個奇怪的錯誤。

SQLSTATE [42S02]:基表或視圖未找到:1146表 'app2.todos' 不存在(SQL:從todostodos其中選擇* id = 1限制1)

及其很奇怪,因爲它總是爲TODOS而喋喋不休,而不是待人正確的名字。我無法在我的代碼中找到TODOS。我甚至做了一個搜索todos。沒有。那麼這是如何發生的呢? 有什麼建議嗎?

回答

1

這是一個Laravel公約。如果在模型類中沒有定義表名,則它將表名稱作爲模型類名稱的複數形式。你可以用你自己的Model類來覆蓋傳統的表名,如下所示。

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class todo extends Model { 

protected $table = 'todo'; 

} 

順便說一句,它也是一個名字與第一個字母大寫的類的慣例。所以它應該是Todo

+0

太棒了。有用。非常感謝你! – Dyon

1

待辦事項,因爲在查找表名期間Laravel中有一個函數用於複數個單詞。 顯示方法因爲待辦事項是從索引方法看不到待辦事項。 你應該在構造函數中設置$ todo作爲一個新的TodoModel實例。 或第二次顯示方法,如索引方法。

0

你必須在模型中用$ table屬性指定你的表名。這是laravel慣例。否則laravel會處理複數形式的表格名稱。

例如:

如果你的模型類的名字是 「用戶」。 Laravel假設你的表名是'用戶',如果你沒有明確地在模型類中定義它的話。最好告訴你的模型類通過這個模型來影響哪個表。

<?php 
    namespace App; 

    use Illuminate\Database\Eloquent\Model; 

    class User extends Model { 

    //it will effect user table because you define it here otherwise laravel will assume 'users' table 
    protected $table = 'user'; 
    }