【问题标题】:Relationship results automatically coming out?关系结果自动出来?
【发布时间】:2015-08-12 09:35:46
【问题描述】:

我的模型上有一系列关系,这里是其中之一。

class Product extends Model{

    public function user(){
        return $this->belongsToMany('\App\User');
    }
}

我得到所有行:

$data = Product::all()

这些都是这样循环的:

 foreach ($data as $value) {
     var_dump($value->title);
 }

我的理解是,如果您希望关系数据也出现,您需要执行以下操作:

$data = Product::with('user')->get();

但即使没有上述内容,只需执行 all(),我仍然可以访问用户:

foreach ($data as $value) {
     var_dump($value->title->user);
 }

这是为什么?

【问题讨论】:

    标签: laravel laravel-4 eloquent laravel-5


    【解决方案1】:

    关系结果自动出来?

    不,基本上当你这样做时

    $data = Product::all();
    foreach ($data as $value) {
      var_dump($value->title);
    }
    

    你正在这样做:

    select * from products
    

    但是在您的 foreach 中,由于您尝试访问未加载的属性,因此您正在执行新查询,因此 Laravel 在幕后获取用户。这代表 N + 1 查询问题,如果您有 25 个产品,您将运行 26 个查询(25+1):

    select * from products
    select * from users where id = ? (x25)
    

    这就是您拥有Eager Loading 选项的原因,

    $data = Product::with('user')->get();
    foreach ($data as $value) {
         var_dump($value->title->user);
     }
    

    这样做你只运行两个查询

    select * from products
    
    select * from users where id in (1, 2, 3, 4, 5, ...)
    

    因此,您可以自行选择使用哪种方法,如果您不迭代所有产品用户,则无需急切加载,通常的 all() 就可以了;

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2016-02-24
      相关资源
      最近更新 更多