【问题标题】:Laravel : $casts in laravel model not working [duplicate]Laravel:laravel 模型中的 $casts 不起作用 [重复]
【发布时间】:2018-02-15 07:00:38
【问题描述】:

我有列id_a(varchar , primary key),其值为 1 - 10。我想将该 id_a 列转换为整数,因此如果我执行查询 \App\Model\Main::max('id_a');,它返回值 10,就像我执行 SELECT MAX(CAST(id_a as integer)) FROM mains 一样。我将此代码添加到我的模型但无法正常工作(\App\Model\Main::max('id_a') 仍然返回值 9):

protected $casts = [
     'id_a' => 'integer',
 ];

这是我模型的完整代码:

protected $table = 'tb_main';
protected $primaryKey = 'id_a';
public $incrementing = false;

protected $guarded = ['id_a'];

protected $casts = [
     'id_acara' => 'integer',
 ];

【问题讨论】:

  • 演员应该只将 '10' 更改为 10(字符串与整数)。如果你期待一个 10 并且得到一个 9 那么其他的事情正在发生。您的数据库中列的数据类型是什么?
  • 是的,如果我执行\App\Model\Main::max('id_a') 查询,它应该返回 10,因为在我在模型中添加 $casts 后 id_a 列已经返回 int 值,但我不知道为什么仍然返回 9。我的数据库中该列的数据类型是 varchar @jfadich
  • 列应该是INT 而不是VARCHAR。 eloquent 中的 max() 方法使用了 SQL MAX() 函数,我怀疑它可能会以不同于整数的方式处理字符串数字。

标签: php laravel


【解决方案1】:

您的$casts 设置根本不会影响像App\Model\Main::max('id_a') 这样的调用——它会直接进入数据库。与在 SQL 中执行 SELECT MAX(id_a) FROM mains 相同。

如果要使用id_a 列作为整数,它应该是数据库中的整数列。当前行为 - 将 9 排序为大于 10 - 意味着它是一个字符串列。

【讨论】:

  • 好的,谢谢,我想通过添加 $casts,如果我打电话给 App\Model\Main::max('id_a') 会做 SELECT MAX(CAST(id_a as integer)) FROM mains @ceejayoz
  • 问题已更新@ceejayoz
  • @Janotama 不,$casts 根本不会改变您的查询,只是它如何处理来自这些查询的数据。如果您希望该列成为整数,请将其设为整数,或采用重复线程中的一种方法。
  • 我用DB::table('mains')->value(DB::raw('MAX(CAST(id_a as integer))'))试了一下,它返回值10,谢谢
  • @dreamcatcher 我很高兴它有效。但请注意,如果有数千或数百万行,该查询会非常很慢,因为每次查询时都需要对数据库中的每一行进行计算。
猜你喜欢
  • 2015-09-07
  • 2015-10-02
  • 2017-07-15
  • 2011-10-18
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
相关资源
最近更新 更多