【问题标题】:Laravel 5.4 - Issue with query builderLaravel 5.4 - 查询生成器问题
【发布时间】:2017-05-25 00:18:35
【问题描述】:

我有一个名为“字符”的表。每行由 / 标识,有一个称为 char_id 的主键。我有路由和模板以及一些带有一些 CRUD 的控制器,所以 Laravel 工作正常。

当用户转到“character/{char_id}”(例如“character/2”)时,我希望能够显示由行 ID 标识的行。

我的网络路由中有以下代码:

Route::get('characters/{char_id}', function($char_id) {
    $character = \DB::table('characters')->find($char_id);
    dd($character);
});

但是当我访问“characters/1”或任何其他数字时,我会收到此错误:

Connection.php 第 647 行中的 QueryException: SQLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列'id'(SQL:select * from characters where id = 1 limit 1)

无论我尝试从 URL 传递什么,它似乎都在寻找一个名为“id”的列。我正在关注一个使用“id”的教程,所以我怀疑我的代码正在寻找一个名为“id”的列,但我不知道如何解决这个问题。

【问题讨论】:

    标签: php mysql laravel-5 laravel-5.4


    【解决方案1】:

    这是因为默认情况下 find 检查 id 列,在不使用模型的情况下解决此问题的最简单方法是自己制作 where :

     $character = \DB::table('characters')->where('char_id', $char_id)->first();
    

    但是,如果你有一个 Character 模型,你可以设置:

    protected $primaryKey = 'char_id';
    

    然后使用 find :

    App\Character::find($char_id);
    

    【讨论】:

    • “默认”意味着您可以更改它。你不能。 Find 明确地与 id 列进行比较。您只能通过扩展Builder 类并重新定义find 方法来更改它。
    • 如果你使用模型就不行,就像我刚刚添加的那样
    • 确实,但是您使用的是 ActiveRecord,而不仅仅是 DBAL。
    • 没错,因为 eloquent 不使用相同的查询生成器,但它仍然是一种轻松地做他想做的事的方法。但是,是的,我明白你的意思,英语不是我的母语
    • 很好,我只是想向任何读者指出这不是一个选择:)
    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 2019-03-29
    • 2017-08-13
    • 2015-08-06
    • 2021-08-11
    • 1970-01-01
    • 2021-01-10
    • 2017-12-09
    相关资源
    最近更新 更多