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, ...)
因此,您可以选择使用哪种方法,如果您没有迭代所有的产品用户,那么不需要急于加载,通常的一切都很好