【问题标题】:Eloquent Model access relational data on method callEloquent 模型在方法调用时访问关系数据
【发布时间】:2016-07-07 18:00:15
【问题描述】:

我们有两种模型和方法历史

class Employment_request extends Model {
    protected $table = 'employment_requests';
    // some code here
    public function history(){
        return $this->hasMany('App\Employment_history');
    }
}


class Employment_history extends Model {
     protected $table = 'employment_history';
     // some code
}

让我们创建就业请求的实例:

$r = Employment_request::find(28)

在这种情况下,在创建就业请求实例时会请求方法历史数据。不是吗?
- 对象占用更多内存
- 需要更多时间来创建它
- 创建对象后添加的历史数据不可访问

因为当我添加新的历史记录时:

Employment_history::create([
    'user_id' => 17,
    'employment_request_id' => 28,
    'change' => '? Stefanka'
]);

及调用方法:

$r->history;

新记录不会随集合返回,但在重新创建对象后会返回。 但是当我打电话时:

$r->history()->get()

我不需要重新创建它来获取新数据。

它在内部是如何运作的? 在修补程序控制台中测试。

【问题讨论】:

  • In this case method history data is requested when instance of Employment_request is created. Isn't it?,只有当你打电话给history时才可用;

标签: orm laravel-5 eloquent


【解决方案1】:

laravel 中有三种加载关系数据的方法。急切加载、延迟加载和延迟急切加载。急切加载是当您检索父模型数据时,您必须添加您必须将关系名称传递给with 方法(Employment_request::with('history')->find(28))然后您可以通过将其作为类变量($r->history;)调用来访问关系。如果您使用此方法,它只会在您检索父模型数据时提供数据库上的关系记录。如果您想在手动添加新的关系记录后获取关系,您必须使用从数据库中检索最新数据的延迟加载方法 ($r->history()->get())。这就是为什么您无法通过方法(急切加载)访问获取新记录的原因。

【讨论】:

  • 感谢您的分析。我的三个结论呢(最后一个除外)。他们是对的吗?
  • 在方法主体中使用简单查询:return Employment_history::where('employment_request_id', $this->id ); 似乎是指定关系的更好解决方案。
  • 取决于您使用获取关系数据的方法,对于预加载是正确的,但是对于延迟加载或延迟预加载,您可以获得新记录。对于通过关系保存新记录,laravel 有自己的方法(附加、同步和保存)。尽量使用eager loading来加载数据,比其他方式更快
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 2018-11-12
  • 2019-08-11
  • 2017-02-17
  • 2019-10-25
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多