【问题标题】:How to build a query in Laravel如何在 Laravel 中构建查询
【发布时间】:2018-01-24 04:59:25
【问题描述】:

我是 laravel 的新手,在理解查询构建器的工作方式方面存在一些问题。

我创建了一个 laravel 项目并将其成功连接到 sqlsrv。现在我想从数据库中检索数据。

对于第一个没有模型的只是在wep.php了解。

Route::get('/tasks', function () {
    $tasks = DB::table('WebShops')->get();
    dd($tasks);
});

这是有效的,它显示了所有的数据库行。

现在我想用find 命令过滤行,我得到一个错误:

Route::get('/tasks/{ShopID}', function($ShopID){
    $task = DB::table('WebShops')->find($ShopID);
    dd($task);
});

SQLSTATE[42S22]:[Microsoft][ODBC Driver 11 for SQL Server][SQL 服务器] 列名“id”无效。 (SQL: select top 1 * from [WebShops] 其中 [id] = 1)

这很令人困惑,因为我将 find 分配给了 ShopID,现在我得到了正在搜索 id 的错误。为什么?

我也试过这个:

 Route::get('/tasks/{ShopID}', function($ShopID){
        $task = DB::table('WebShops')->where('ShopID', $ShopID);
        //dd($task->name); here comes also an error
        dd($task);

 });

这向我展示了一个包含我不太了解的数据的大数组。

我的数据库如下所示:

【问题讨论】:

  • $task = DB::table('WebShops')->where('ShopID', $ShopID)->get();
  • 你打败了我@u_mulder :D
  • 您应该创建一个模型,然后调用它以更简单方便的方式。例如:$webshops = App\WebShop::all(); // 这将调用表 'WebShop' 中的所有数据

标签: php sql-server laravel


【解决方案1】:
class WebShop extends Model {
     //You need this because by convention Laravel assumes table names are snake_cased (it would look for web_shops)
     protected $table = "WebShops"; 

     // You need this because by convention the primary key is called id.
     protected $primaryKey = 'ShopID';
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以在help center找到更多关于如何写好答案的信息。
【解决方案2】:

由于您是 Laravel 的新手,这是开始构建模型而不是使用查询构建器的好机会。

class WebShop extends Model {
     //You need this because by convention Laravel assumes table names are snake_cased (it would look for web_shops)
     protected $table = "WebShops"; 

     // You need this because by convention the primary key is called id.
     protected $primaryKey = 'ShopID';

}

那么下面的代码就可以工作了:

$shop = WebShop::find($id);

Laravel's Eloquent 是阅读更多信息的好书。

【讨论】:

    【解决方案3】:

    在代码中

    Route::get('/tasks/{ShopID}', function($ShopID){
        $task = DB::table('WebShops')->find($ShopID);
        dd($task);
    });
    

    您尝试查找 what 字段等于 $ShopID 值的行?

    Laravel 不知道。因此,它假设您将字段 id 作为主键。由于您没有这样的字段,根据您的表结构,您有一个错误。

    根据手册,您可以重新定义主键:

    public $primarykey = 'ShopID';
    

    在您的模型文件中。

    第二次尝试接收记录集合 - 添加get()

    Route::get('/tasks/{ShopID}', function($ShopID){
        $task = DB::table('WebShops')->where('ShopID', $ShopID)->get();
        dd($task);
    });
    

    【讨论】:

      【解决方案4】:

      如果您使用“ShopID”作为您必须在模型中定义的主键,则默认情况下查找是在表中查找列 ID,例如

      protected $primaryKey = 'ShopID';
      

      之后它就开始工作了

      $task = DB::table('WebShops')->find($ShopID);
      

      【讨论】:

      • 如何在模型中定义一个primery key,以便find命令处理它?
      • 受保护的 $primaryKey = 'ShopID';
      • 不幸的是,当我创建一个模型并将其提供给 web.php $tasks = App\WebShops::all(); 时,我收到了一个错误 SQLSTATE[42S02]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Invalid objectname "web_shops". (SQL: select * from [web_shops])。为什么他在不同的桌子上搜索?我的桌子看起来像这样WebShops
      • 如何通过 CLI 创建模型?
      猜你喜欢
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2018-04-22
      • 2015-10-09
      • 1970-01-01
      • 2020-06-03
      • 2021-09-25
      相关资源
      最近更新 更多