【问题标题】:Laravel: Getting Session ID oddly truncates when using foreachLaravel:使用 foreach 时获取会话 ID 会奇怪地截断
【发布时间】:2016-10-31 14:13:49
【问题描述】:

所以这有点奇怪......在 Laravel 5.2 中,我试图从会话数据库表中检索 id。我正在使用 Artisan 生成的默认 Sessions 迁移。

Session.php(会话模型,这就是我的全部):

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Session extends Model
{
    protected $table = 'sessions';
}

如果我使用$sessions = Session::where('user_id', Auth::user()-&gt;id)-&gt;get(); 并使用dd($sessions); 查看嵌套数组,则会显示完整的ID;例如402de1fd4c6f3a9bda5d4f4c5980e5748dcddbde。但是,当我这样做时

foreach($sessions as $session) {
    $id = $session->id;
}

dd($id); 只截断字符串中任何字母之前的第一个数字;在这个例子中402。如果没有初始数字,则返回0

有什么理由会发生这种情况吗?不幸的是,由于在运行 dd 之前我没有进行任何操作,所以我无法弄清楚这个字符串发生了什么。

【问题讨论】:

  • 你能发布你的Session模特吗?
  • @z3r0ck 当然,我更新了我的问题。
  • 我最初的想法是模型中可能存在类型转换。但事实并非如此。我不确定为什么会发生这种情况,但是您获得的值的行为就像它被强制转换为 int。尝试将其添加到您的模型中。 protected $casts = [ 'id' =&gt; 'string', ];
  • @z3r0ck 有趣,这很有效。谢谢!我想知道导致这种情况的 Laravel 代码库背后发生了什么?还是可能是某种奇怪的 PHP 错误?
  • 在幕后,laravel 似乎将所有id 属性转换为int

标签: php laravel session eloquent


【解决方案1】:

当您调用 $session-&gt;id 时,它会从您的模型调用 php 魔术方法 __get,然后从该方法调用 getAttribute 方法,然后从 getAttributeValue 调用 getAttributeValue,然后调用其他一些方法,然后对其进行检查 @987654327 @ 然后它从该方法调用getCasts (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L2769-L2778)

正如您在主键中看到的那样,它添加了一个默认演员 int,因此对于您的问题,您可以使用 cast

protected $casts = [ 'id' => 'string', ];//This part is taken from the comment of z3r0ck

或者只是添加$keyType

protected $keyType = 'string';

【讨论】:

  • $keyType 属性是否有任何文档?如果有链接会很棒!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2012-02-02
  • 1970-01-01
  • 2014-03-06
相关资源
最近更新 更多