【问题标题】:Laravel problem with relation leading zero关系前导零的Laravel问题
【发布时间】:2019-05-31 10:32:28
【问题描述】:

当几个模型 id 相同但另一个具有前导零而另一个没有时,我遇到了 Laravel 关系问题。

Product ID | Productname  
-----------|------------ 
012345     | Product A
12345      | Product B

如果在同一个查询中加载了这些关系,则只会返回第一个,而不会返回另一个。

数据库列是字符串,在 Product 模型中,我已将递增设置为 false 并将 id 属性强制转换为字符串。 Laravel 的热切加载不考虑前导零吗?

我无法更改带有前导零的产品 ID。

提前致谢!

【问题讨论】:

  • 请分享关系定义代码。
  • 请给我们看看你的模型类,好吗?
  • eloquent 模型有一个属性来设置主键类型。将其从整数更改为字符串。它还有一个键来定义主键是否是自动递增的。将其设置为假。不确定这个属性的名称,但我相信你能找到它! :-)
  • 正如我在回答中提到的,但后续投票是不支持的,您需要定义 public $incrementing = false; 并在迁移中将属性类型设置为 string
  • "我已将递增设置为 false"

标签: laravel laravel-5.5 eager-loading leading-zero


【解决方案1】:

我只是在本地 laravel 安装上运行测试,但无法重现问题。

您确定这不是您构建查询的方式的问题吗?因为如果在您的程序中的任何时候$id 变量被视为一个整数,未来转换为字符串将删除前导零。

例如,也许你从请求中获取 id:

$productId = $request->get('product_id');

此时$productId 被认为是一个整数,因此如果您使用productId 来查询您的数据库,则会删除前导零。

您需要确保在请求的生命周期内,该变量永远不会转换为整数。

您可以使用tinker 测试正确的查询,并手动获取您的产品:

Product::find('012345');
Product::find('12345');

【讨论】:

  • 我正在查询另一个将产品作为关系的模型。我认为这个问题与急切加载有关,因此框架认为该产品已经加载,即使另一个产品中有前导零。这些与单独的查询一起正常工作。
猜你喜欢
  • 2022-11-15
  • 2013-04-03
  • 1970-01-01
  • 2017-02-07
  • 2014-04-18
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多