Laravel 关系结果会自动出来吗?

Laravel 关系结果会自动出来吗?,laravel,laravel-4,eloquent,laravel-5,Laravel,Laravel 4,Eloquent,Laravel 5,在我的模型上有一系列关系,这里是其中之一 class Product extends Model{ public function user(){ return $this->belongsToMany('\App\User'); } } 我使用以下命令获取所有行: $data = Product::all() 这些都是这样循环的: foreach ($data as $value) { var_dump($value->title)

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

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();
但是,即使没有上述内容,并且只做了一个“所有”操作,我仍然可以访问用户:

foreach ($data as $value) {
     var_dump($value->title->user);
 }
为什么会这样

关系结果会自动出来吗

不,基本上当你这样做的时候

$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)
这就是为什么你可以选择

执行此操作时,您只运行两个查询

select * from products

select * from users where id in (1, 2, 3, 4, 5, ...)
因此,您可以选择使用哪种方法,如果您没有迭代所有的产品用户,那么不需要急于加载,通常的一切都很好

关系结果会自动出来吗

不,基本上当你这样做的时候

$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)
这就是为什么你可以选择

执行此操作时,您只运行两个查询

select * from products

select * from users where id in (1, 2, 3, 4, 5, ...)
因此,您可以选择使用哪种方法,如果您没有迭代所有的产品用户,那么不需要急于加载,通常的一切都很好