【问题标题】:Get value of an Object inside a Collection获取集合内对象的值
【发布时间】:2019-02-05 20:24:38
【问题描述】:

我在我的 Laravel 应用程序中使用来自 Yajra 的 DataTables as Service。

我有一个这样的收藏:

Collection {#1178
    #items: array:2 [
    0 => array:7 [
      "email" => "user1@example.com"
      "id" => 6
      "emailBlacklisted" => false
      "smsBlacklisted" => false
      "modifiedAt" => "2019-02-05T17:20:17.723+01:00"
      "listIds" => array:2 [
        0 => 2
        1 => 3
      ]
      "attributes" => {#1139
        +"NAME": "Doe"
        +"FIRSTNAME": "John"
      }
    ]
    1 => array:7 [
      "email" => "user2@example.com"
      "id" => 1
      "emailBlacklisted" => false
      "smsBlacklisted" => false
      "modifiedAt" => "2019-02-05T21:12:04.094+01:00"
      "listIds" => array:1 [
        0 => 2
      ]
      "attributes" => {#1143}
    ]
  ]
}

在我的刀片视图中,我使用 {{ $email }} -> 简单显示电子邮件值

我认为这对你来说是一个非常容易的问题......

但我无法显示属性键的值。 (我想显示名称:Doe)。 -> attributes 是我收藏中的一个对象。

谢谢你帮我解锁...

【问题讨论】:

    标签: php laravel object laravel-collection


    【解决方案1】:

    如果我理解正确,您希望能够显示属性的键和值。

    如果您使用刀片,您可以尝试扩展的 foreach 循环:

    @foreach($attributes as $key => $value)
        {{ $key }}: {{ $value }}
    @endforeach
    

    这假设您已经可以访问每个单独模型的属性,例如 $item->email 或在本例中为 $item->attributes。如果需要,可以@foreach($item->attributes as $key => $value) 启动它。


    如果您只想显示特定值,请使用 null-coalesce 运算符 ??

    $item->attributes['NAME'] ?? ''
    

    您可以在其他地方的逻辑中使用它与任何可能为空的表达式:

    // the fallback does not have to be a string
    $person = Person::find($id) ?? Person::first();
    
    // it can be chained
    $value = $parameter ?? $localDefault ?? $globalDefault;
    

    如果未找到 NAME,它将回退到 ?? 之后的内容,在上面的示例中它是一个空字符串。如果属性不存在,这是避免任何错误的好方法。它与三元检查是否为空做同样的事情:

    ($item->attributes['NAME'] !== null) ? $item->attributes['NAME'] : '';
    

    这显然很混乱,所以 null-coalesce 运算符就派上用场了!

    【讨论】:

    • 好的,谢谢,但是通过这个 foreach 循环,所有属性都显示出来了,我只想显示 NAME。 if($key == "NAME") { echo $value; } 这个方法够吗?还是有另一种不使用 if 条件的方法?
    • @yagrasdemonde,请参阅我对 null-coalesce 运算符的编辑。忘记 foreach 循环,直接使用示例访问它。
    【解决方案2】:

    好的,@GoogleMac 让我走上了正轨。 事实上,由于 NAME 属性并不总是存在,我必须使用

    来测试变量
        isset()
    

    函数而不是

        !== NULL
    

        {{ isset($attributes->NOM) ? $attributes->NAME : 'NC' }}
    

    代码运行良好。

    谢谢@GoogleMac 和@Davit

    【讨论】:

      【解决方案3】:

      您应该简单地执行以下操作:

      @foreach($collection as $item)
        {{$item->NAME}}
      @endforeach
      

      注意:NAME 必须是属性变量中的键。

      attributes 变量是受保护的,所以你不能直接从对象外部引用它。如果您通过拥有它的对象引用该值,则会自动映射该值。

      【讨论】:

      • 如果你仔细看你一定会注意到每一项都不是雄辩的实例,你可以直接访问attributes属性。在这种情况下也是belongs to关系
      • 很公平,但为什么不呢?他们如何以及为什么要转换为数组?
      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 2012-07-27
      • 2019-02-02
      • 2019-08-06
      相关资源
      最近更新 更多