【问题标题】:Eloquent Eager Loading with $append Attribute带有 $append 属性的 Eloquent Eager Loading
【发布时间】:2017-06-03 18:25:54
【问题描述】:

我有点卡在这里,不知道如何继续前进。

我有两个模型:userchild,他们处于Relationship中。

(请记住,这只是说明问题)

class Child extends Model{

    protected $primaryKey = 'id_child';

    public $appends = ['is_alive'];

    public function user(){

        return $this->belongsTo('Models\User','id_user');

    }

    public function getIsAliveAttribute(){

        if (!is_null($this->lifetime_updated_at))
            return (Carbon::parse($this->lifetime_updated_at)->addMinute($this->lifetime) >= Carbon::now());
        else
            return false;
    }
}

class User extends Model{

    protected $primaryKey = 'id_user';

    public $appends = ['is_alive'];

    public function childs(){

        return $this->hasMany('Models\Child','id_user');
}

public function getIsAliveAttribute(){

    if (!is_null($this->lifetime_updated_at))
        return (Carbon::parse($this->lifetime_updated_at)->addMinute($this->lifetime) >= Carbon::now());
    else
        return false;
}

}

现在我想在控制器中使用 Eager Loading 从用户那里检索我的 Childs 数据。

但我的用户模型对象来自我的应用程序中的中间件。所以我只有用户模型对象可以使用,我不想再次使用“with()”查询用户。

$user = User::where('name','DoctorWho')->first();

return user->childs()->find(3);

此操作返回的内容:

    {
        "id_child": 3,
        "name": "JayZ",
        "last_name": "Etc",
        "lifetime": 1,
        "lifetime_updated_at": null,
        "created_at": "2017-05-29 21:40:02",
        "updated_at": "2017-05-29 21:40:02",
        "active": 1   
}

我需要什么(附加属性)

{
    "id_child": 3,
    "name": "JayZ",
    "last_name": "Etc",
    "lifetime": 1,
    "lifetime_updated_at": null,
    "created_at": "2017-05-29 21:40:02",
    "updated_at": "2017-05-29 21:40:02",
    "active": 1,
    "is_alive": true
  }

甚至可以使用 Eager Loading 检索具有 附加属性 的子数据吗?

注意:这个用户对象来自一个中间件,我必须使用用户模型对象来获取它的子对象,并附加属性。

提前致谢, 洛斯罗伯斯

【问题讨论】:

    标签: laravel laravel-5 eloquent


    【解决方案1】:

    问题是我做错了与 Eloquent 访问模型无关的错误,就像附加属性一样!

    【讨论】:

      【解决方案2】:

      您在这里所做的不是急切加载。你的childs 关系是错误的。应该是return $this->hasMany('Models\Child', 'id_user'); 基于模型和定义的其他关系。

      您可以通过以下方式访问儿童信息。这些默认情况下应该尊重$appends 属性并加载该字段。

      $childId = 3;
      
      $user = User::with('childs')
          ->where('name', 'DoctorWho')
          ->first();
      
      return $user->childs()->where('id_child', $childId)->first();
      
      // Or
      
      $user = User::with(['childs' => function ($query) use ($childId) {
              $query->where('id_child', $childId);
          }])
          ->where('name', 'DoctorWho')
          ->first();
      
      return $user->childs->first();
      
      // Or
      
      $child = Child::whereHas('user', function ($query) {
              $query->where('name', 'DoctorWho');
          })
          ->find(3);
      
      return $child;
      

      编辑:

      如果您已经拥有用户模型,那么您可以这样做。

      $child = Child::where('id_user', $user->id_user)
          ->where('id_child', 3)
          ->first();
      
      return $child;
      

      【讨论】:

      • 我拼错了关系,我已经编辑了原始问题。
      • 问题是我已经有一个用户模型对象,我不能使用“with”我只能使用用户模型来访问它的孩子。
      • @IgorMorse 那么您可以在现有模型上使用load() 而不是with() 来延迟加载关系。 `$user->childs()->where('id_child', $childId)->first();``即使你没有急切地加载关系,这也可以正常工作。急切加载只是防止 N+1 查询问题。在这种情况下,它不会有任何区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      相关资源
      最近更新 更多