【问题标题】:Looping through relationship stored from an array in laravel循环遍历从 laravel 中的数组存储的关系
【发布时间】:2020-05-01 07:13:42
【问题描述】:

是否可以循环存储这样的关系名称的数组?

$input_list1 = ['certificateQualification()','surgeryExperience()','assocOrganization()','mediaWebsite()'];   

    foreach ($input_list1 as $key => $value) {
      // dd($user->$value);  //null
      // dd($user->certificateQualification);
      // dd($user->certificateQualification()->isEmpty());  //false
    }       

dd($user->$value); 现在返回 null

$user->certificateQualification()

App\Models\UserCustomData {#4603
  #connection: "mysql"
  #table: "user_custom_data"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:6 [
    "id" => 229
    "user_id" => 3
    "type_id" => 1
    "content" => "test1"
    "created_at" => "2020-04-30 15:18:28"
    "updated_at" => "2020-04-30 15:18:28"
  ]
  #original: array:6 [
    "id" => 229
    "user_id" => 3
    "type_id" => 1
    "content" => "test1"
    "created_at" => "2020-04-30 15:18:28"
    "updated_at" => "2020-04-30 15:18:28"
  ]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [
    0 => "*"
  ]
}

我可以像这样遍历数据库变量

    $profile_completion = 0;
    $input_list = [];
    $input_list[0] = ['veterinarian_type','area_of_skill'];
    $input_list[1] = ['id','role_id','first_name','first_kana_name','nick_name','email','phone_number','gender','dob'];
    $input_list[2] = ['self_description'];   


   $complete_list = [];
    foreach ($input_list as $key => $value) {
      $flag = 1;
      foreach ($value as $key1 => $value1) {
        if (!$user->$value1) {
          $flag = 0;
        }
      }
      if ($flag == 1) {
        $complete_list[$key] = 10;
      }else{
        $complete_list[$key] = 0;
      }
    }   

我想避免这些步骤(我目前正在使用这个)

    if ($user->certificateQualification()->isEmpty()) {
      $complete_list[3] = 10;
    }else{
      $complete_list[3] = 0;
    }

    if ($user->surgeryExperience()->isEmpty()) {
      $complete_list[4] = 10;
    }else{
      $complete_list[4] = 0;
    }
    dd($complete_list);

    if ($user->assocOrganization()->isEmpty()) {
      $complete_list[5] = 10;
    }else{
      $complete_list[5] = 0;
    }

    if ($user->mediaWebsite()->isEmpty()) {
      $complete_list[6] = 10;
    }else{
      $complete_list[6] = 0;
    }    

这是我的用户模型

public function customData()
{
    return $this->hasMany('App\Models\UserCustomData', 'user_id','id');
}

public function certificateQualification()
{
    return $this->customData->where('type_id',1);
}

public function surgeryExperience()
{
    return $this->customData->where('type_id',2);
}

我真的可以循环这段关系吗?请帮我解决这个问题。

【问题讨论】:

  • certificateQualification()是关系方法吗?
  • 我已经更新了问题,并在用户模型上添加了关系

标签: laravel relationship


【解决方案1】:

您可以使用() 像这样通过字符串调用该方法:

$input_list1 = ['certificateQualification','surgeryExperience','assocOrganization','mediaWebsite'];   
foreach ($input_list1 as $key => $value) {
    dd($user->$value()); // $user will call the method certificateQualification()
}

为了获得更好的性能:

在这些方法中,你调用了用户的所有关系数据,并通过收集方法where('type_id', 1)过滤所有这些数据,你可以这样优化它:

public function certificateQualification()
{
    // this one will return the eloquent builder of customData,
    // if you want to get the datas, try $user->certificateQualification()->get()
    return $this->customData()->where('type_id', 1); 
}

并通过exists() 方法检查此查询是否为空:

foreach ($input_list1 as $key => $value) {
    if ($user->$value()->exists()) {
        ...
    }
    ...
}

【讨论】:

  • 它工作了,但存在()函数显示此错误:- Method Illuminate\Database\Eloquent\Collection::exists 不存在。
  • @Nadiya 是的,如果你想使用exists,你需要将方法更改为$this->customData()->where('type_id', 1); ;检查customData() 有括号,它将返回雄辩的构建器而不是集合。
  • @Nadiya 调用->customData 不带括号将等于->customData()->get(),它将数据返回数据库,并返回集合。这里我建议用括号调用customData,这样数据库中的数据,在->get()之前使用where()将过滤数据库中的数据,并从db中取出更少的数据。这个性能更好。
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2016-04-14
相关资源
最近更新 更多