【问题标题】:How to access array properties with Laravel Eloquent, if stored in a database?如果存储在数据库中,如何使用 Laravel Eloquent 访问数组属性?
【发布时间】:2019-10-02 15:18:49
【问题描述】:

例如,我将 JSON 存储在名为“data”的数据库的一行中

External.php(模型) - 将“数据”转换为数组:

protected $casts = [
    'data' => 'array',
];

我可以使用 Tinker 通过以下命令访问它:

$external = App\External::first()->pluck('data');

这会返回

 Illuminate\Support\Collection {#3384
     all: [
       [
         "id" => 17566616456845,
         "name" => "#1008",
         "note" => "",
         "tags" => "",
         "test" => false,
         "email" => "katie.jane@example.com",
         "phone" => null,

         ...
         ..
         .

如何访问该集合中的“电子邮件”或“ID”?如何修改 tinker eloquent 命令以获取“id”或“email”?

$external = App\External::all()->pluck('data')->'email'

T_STRING 或 T_VARIABLE 或 '{' 或 '$' 在第 1 行> 异常消息“属性 [email] 在此不存在> PHP 解析错误:语法错误,意外的 T_CONSTANT_ENCAPSED_STRING, 期待

变暖:

>>> $external = App\External::pluck('data')->get('email')
=> null

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    pluck() 方法返回数组。因此,如果您想访问“电子邮件”,您必须使用。

    $external = App\External::first()->pluck('data');
    
    $email = $external['email']; // katie.jane@example.com
    

    【讨论】:

    • pluck 返回一个集合
    • >>> $email = $external['email'] PHP 注意:未定义索引:/home/vagrant/code/{domain_name_censored}/vendor/laravel/framework/src/Illuminate/ 中的电子邮件支持/Collection.php 在第 1290 行 >>>
    【解决方案2】:

    如果您只是想获取一条记录的数据,请使用 cast 属性作为数组:

    // one External record
    $external = App\External::first();
    
    $email = $external->data['email'];
    $id = $external->data['id'];
    

    【讨论】:

    • 这行得通,谢谢...但是,您如何也回复所有电子邮件?
    【解决方案3】:

    试试这个

    $external = collect(App\External::all()->pluck('data'))->pluck('email')->all();
    

    【讨论】:

      【解决方案4】:

      您不必使用pluck()

      如果您想从外部数据访问电子邮件。

      $email = App\External::first()->data['email'];
      

      更新

      获取所有电子邮件。

      $emails = App\External::all()
          ->map(function($external) {
              return $external->data['email'];
          });
      

      【讨论】:

      • 这行得通,谢谢...但是,您如何也回复所有电子邮件?
      • 这样做可以得到all()map()的结果。
      猜你喜欢
      • 2020-12-03
      • 2020-02-06
      • 2023-03-13
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多