Laravel的Findorfail不工作

时间:2015-06-25 14:54:12

标签: php laravel-5

我可能只是没有想好,但这是我的问题: 我试图通过构建一个简单的待办事项来学习laravel。

我有一个型号名称todo。

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

我的路线:

Route::get('todo', 'pagesController@index');

Route::get('/todo/{id}','pagesController@show');

我的控制员:

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:select {from todos where todos。{{1 }} = 1限制1)

它很奇怪,因为它总是为TODOS而不是todo,这是正确的名称。我在代码中的任何地方都找不到TODOS。我甚至搜索了待办事项。没有。那么这是怎么发生的呢? 有什么建议吗?

3 个答案:

答案 0 :(得分:3)

这是一个Laravel会议。如果在模型类中没有定义表名,则它将表名称假定为模型类名的复数形式。您可以在Model类中使用自己的常规表名覆盖,如下所示。

<?php

 namespace App;

 use Illuminate\Database\Eloquent\Model;

 class todo extends Model {

 protected $table = 'todo';

 }

顺便说一下,使用首字母大写命名一个类也是一种约定。所以它应该是Todo

答案 1 :(得分:1)

todos因为在查找表名时Laravel中有一个函数用于复数单词。 show方法看不到todo,因为todo来自索引方法。 你应该在构造函数中将$ todo设置为一个新的TodoModel实例。 或者像在索引方法中那样第二次使用show方法。

答案 2 :(得分:0)

您必须通过$ table属性在模型中指定表名。这是laravel惯例。否则laravel会处理复数形式的表格名称。

示例:

如果您的模型类名称是“User”。如果您没有明确地在模型类中定义表名,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';
     }