【问题标题】:Laravel Eloquent::Find() returning NULL with an existing IDLaravel Eloquent::Find() 返回具有现有 ID 的 NULL
【发布时间】:2014-11-26 04:57:06
【问题描述】:

这很简单,因为它是最基本的东西,但我不知道我错过了什么:

有一个名为Site的模型

我正在使用 Eloquent ORM,所以当我调用(在控制器中)时

$oSite = Site::find(1)

然后

var_dump($oSite);

它返回一个值NULL

但是当我检查数据库时,表'sites'实际上包含以下项目:

id: 1
user_id: 1
name: test

在我的Site model我有以下代码:

use Illuminate\Database\Eloquent\ModelNotFoundException;

 Class Site extends Eloquent {

        protected $table = 'sites';

        protected $fillable = ['user_id', 'name'];
 }

相反,如果我使用以下内容收集项目:

$oSite = DB::table('sites')
                ->where('id', 1)
                ->first();

它有效,我得到了正确的寄存器。

我做错了什么?我没有得到文档的哪一部分?

编辑:

型号代码可以在上面查看。

控制器

use Illuminate\Support\Facades\Redirect;
class SiteManagementController extends BaseController {

...

    public function deleteSite()
    {
        if (Request::ajax())
        {
            $iSiteToDelete = Input::get('siteId');

            $oSite = Site::find($iSiteToDelete);

            return var_dump($oSite);
        }
        else
        {
            return false;
        }
    }
}

编辑 2:(已解决)

无法正常工作的真正原因:

我的模型代码中最初如下:

use Illuminate\Database\Eloquent\SoftDeletingTrait;
use Illuminate\Database\Eloquent\ModelNotFoundException;

Class Site extends Eloquent {

    protected $table = 'sites';

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

    protected $fillable = ['user_id', 'name'];
}

问题是我在启动项目后添加了一个“deleted_at”列,当我应用迁移时,我没有启用软删除。 显然,我犯了第二个错误,忘记启用 'deleted_at' 可以为空,因此所有插入的时间戳都错误(0000-00-00 ...)。

修复:

  1. 将“deleted_at”列设为可为空。

  2. 将所有错误的“deleted_at”时间戳设置为NULL

【问题讨论】:

  • 显示模型和控制器方法。
  • @JarekTkaczyk 编辑了帖子并添加了 Contoller 方法。模型“站点”在上面。
  • @JarekTkaczyk 自行解决。问题来源与数据库有关。

标签: php laravel orm find eloquent


【解决方案1】:

你没有退回你的模型。

var_dump 打印输出并且不返回任何内容。

改为这样做:

dd($oSite); // stands for var_dump and die - a helper method

甚至更好,只需返回模型:

return $oSite; // will be cast to JSON string

【讨论】:

    【解决方案2】:

    检查您是否正确获取了Input::get('siteId')。如果你得到它然后尝试将它转换为整数,即

    $iSiteToDelete = intval(Input::get('siteId'));
    

    【讨论】:

    • 是的,在 var_dumping Input::get('siteId') 之后我得到了正确的值。
    • 您是否在 var_dump 中获取整数值?
    • link 请查看此链接
    • 检查了链接。不, Input::get('siteId') 返回一个字符串,而不是 intval
    • 是的,它现在正在工作,但不是因为类型更改。现在 Site::find($iSiteToDelete) 正在工作,即使 $iSiteToDelete 实际上是一个字符串。发生了什么?我真的不知道。
    猜你喜欢
    • 2016-04-27
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2021-08-22
    相关资源
    最近更新 更多