Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Laravel Controller需要(整数)在Homestead中强制转换,而不需要在生产服务器中强制转换_Laravel_Casting_Controller_Integer_Homestead - Fatal编程技术网

为什么Laravel Controller需要(整数)在Homestead中强制转换,而不需要在生产服务器中强制转换

为什么Laravel Controller需要(整数)在Homestead中强制转换,而不需要在生产服务器中强制转换,laravel,casting,controller,integer,homestead,Laravel,Casting,Controller,Integer,Homestead,(整数)必须在Homestead中对控制器参数进行强制转换 我很难找到本地开发环境(Homestead)与托管环境之间存在差异的原因。 我定义的路线如下: Route::get('group/{id}/data', 'GroupDataController@index'); public function index($id) { return Grouping::all()->where('group_id', $id); } public function index($i

(整数)必须在Homestead中对控制器参数进行强制转换

我很难找到本地开发环境(Homestead)与托管环境之间存在差异的原因。 我定义的路线如下:

Route::get('group/{id}/data', 'GroupDataController@index');
public function index($id)
{
    return Grouping::all()->where('group_id', $id);
}
public function index($id)
{
    return Grouping::all()->where('group_id', (integer)$id);
}
控制器中的代码如下所示:

Route::get('group/{id}/data', 'GroupDataController@index');
public function index($id)
{
    return Grouping::all()->where('group_id', $id);
}
public function index($id)
{
    return Grouping::all()->where('group_id', (integer)$id);
}
这在生产环境(hosted env)中运行良好,但当我在本地执行它时,它会抛出并清空数组[],除非我将控制器函数修改为如下所示:

Route::get('group/{id}/data', 'GroupDataController@index');
public function index($id)
{
    return Grouping::all()->where('group_id', $id);
}
public function index($id)
{
    return Grouping::all()->where('group_id', (integer)$id);
}
我不知道这里发生了什么,我厌倦了在我的控制器上进行更改,使其在两种环境下都能工作。 我已经搜索了好几个地方,但可能我使用了不正确的令牌进行搜索,因为我什么也没找到。
非常感谢您的帮助。

这里的问题是您没有使用正确的函数集

当您调用
Grouping::all()
时,实际上是在返回一个雄辩的
集合
对象,其中包含groupings表中的每条记录。然后在此
集合上调用
where()
方法。这导致了两个问题:一是效率极低;第二,
集合上的
where()
方法与查询生成器上的
where()
方法的工作方式不同

集合上的
where()
方法接受三个参数:字段名称、要筛选的字段中的值,最后是一个布尔值,用于告诉它是否要进行严格比较(==)或松散比较(==)。第三个参数默认为strict。这种严格的比较就是为什么会出现这样的问题,但我无法解释为什么一个环境将
$id
视为整数,而另一个环境则不将其视为整数

查询生成器对象上的
where()
方法实际上会将where子句添加到正在执行的SQL语句中,这是一种更有效的数据过滤方法。它还具有更大的灵活性,因为它不仅限于equals比较(第二个参数是where子句的比较运算符,如果省略它,则默认为“=”)

您有两种解决问题的方法。您可以将
false
作为第三个参数传入当前代码中的
where()
方法(错误),也可以更新代码以使用查询进行实际筛选,而不是对整个
集合进行筛选(正确)

我建议将您的代码更新为:

public function index($id) {
    return Grouping::where('group_id', '=', $id)->get();
}
在上面的代码中,
Grouping::where('group_id','=',$id)
将生成一个包含给定where子句的查询生成器对象,然后
get()
将执行查询并返回结果的
集合。

我将@patricus(非常感谢!)标记为正确答案,因为他确实为我指出了正确的方向,让我明白,在不同的上下文中,有些关键字的工作方式不同(比如get()),但我还要指出,在我的例子中,我的两个困惑点是如何解决的:

  • 通过将我的宅地指向生产数据库,解决了我的代码在生产环境和宅地开发环境之间的差异。我不确定有什么不同(可能是排序规则或表格格式),但它给了我一个快速的答案
  • 我试图过滤数据库中的元素列表,但我用错误的逻辑为Laravel构建了它
  • 为了澄清我在第二点中提到的内容,我使用了以下代码:

    Grouping::all(['id', 'name_id', 'product_id', 'ship_id'])->where('name_id', '=', $id);
    
    我认为这是可行的,因为它将选择所有项目和选定的列,然后用where子句过滤这些项目。但是我错了,因为,正如我后来发现的,正确的写作方式是:

    Grouping::where('name_id', $id)->select('id', 'name_id', 'product_id', 'ship_id')->get();
    
    这是因为我完全忘记了我正在组装查询,而不是编写我期望程序执行的操作。 第二种语法有更多的逻辑,因为我指定了过滤器,然后将列放在过滤的内容上,最后使用get()子句执行查询

    当然,它也可以写在另一面,以便更清晰流畅地阅读:

    Grouping::select('id', 'name_id', 'product_id', 'ship_id')->where('name_id', $id)->get();
    

    当我尝试按建议实现时,我得到:Object of class Illumb\Database\Eloquent\Builder无法转换为字符串。我的Eloquent模型似乎无法访问where方法(甚至我的IDE也发出了警告)。@iaef您确定要添加对
    ->get()
    的调用吗?如果禁用了
    ->get()
    ,则会出现该错误。@iaef对
    where()
    的解释:雄辩的模型实际上没有
    where()
    方法。但是,它使用PHP magic
    \uu call()
    方法将任何缺少的方法重定向到有说服力的查询生成器。如果雄辩的查询生成器没有该方法,它将使用
    \u call()
    方法重定向到流畅的查询生成器。如果Fluent query builder没有该方法,那么您将得到一个
    BadMethodCallException
    。我通过将Homestead服务器连接到生产数据库,纠正了编码上的差异(需要转换为整数)。表定义中可能有一些不同的内容,比如排序规则@patricus你的建议很管用,但我发现如果我只返回一些列,我就得不到我想要的。你的解释为我澄清了一切。我正在尝试:
    Application::all(['id','test\u id','schedule\u id','school\u id'])->where('test\u id','=',$id)->get('id')但是我得到了一个空白页面,里面什么都没有。使用最终的代码(看起来正确),您应该能够将Homestead实例切换回开发数据库,因为代码不再在php中进行严格的比较,而是将值发送到sql查询。如果您的最终代码在您的开发环境中仍然失败,那么这是非常令人困惑的。