Php 将Laravel查询转换为即时加载

Php 将Laravel查询转换为即时加载,php,laravel,eager-loading,Php,Laravel,Eager Loading,我一直在学习Laravel,并试图实现一些东西,我做到了,它起了作用,但我听说可能可以用更简单的方式使用渴望加载来实现 假设我们有4个表:车库,汽车,证券,场所 车库是你可以找到汽车的地方,证券是保证汽车在车库内安全的安全措施,场所是你可以找到类似车库的地方 我要列出的是车库,并将汽车、证券和场所这三个表连接起来,如下所示: Garage 1 has 2 cars with 3 securities and has 3 more garages similar Garage 2 has 1 ca

我一直在学习Laravel,并试图实现一些东西,我做到了,它起了作用,但我听说可能可以用更简单的方式使用渴望加载来实现

假设我们有4个表:
车库
汽车
证券
场所

车库
是你可以找到
汽车
的地方,
证券
是保证汽车在车库内安全的安全措施,
场所
是你可以找到类似车库的地方

我要列出的是
车库
,并将
汽车
证券
场所这三个表连接起来,如下所示:

Garage 1 has 2 cars with 3 securities and has 3 more garages similar
Garage 2 has 1 cars with 1 securities and has 2 more garages similar
以下是查询:

select 
    g.garage_name, 
    count(distinct c.car_id) as count_cars,
    count(distinct s.security_id) as count_securities,
    count(distinct p.place_id) as count_places
from garages g
left join cars c on c.garage_id = g.garage_id
left join securities s on s.car_id = c.car_id
left join places p on p.garage_id = g.garage_id
group by g.garage_name
order by g.garage_name;
正如你所看到的,它正在发挥作用

我将其转换为:

$garages = Garages::select('garage_name',
DB::raw('count(distinct cars.car_id) as count_cars'),
DB::raw('count(distinct securities.security_id) as count_securities'),
DB::raw('count(distinct places.place_id) as count_places'))
->leftJoin('cars', 'cars.garage_id', '=', 'garages.garage_id')
->leftJoin('securities', 'securities.car_id', '=', 'cars.car_id')
->leftJoin('places', 'places.garage_id', '=', 'garages.garage.id')
->groupBy('garages.garage_name')
->orderBy('garages.garage_name')
->get();
正如我上面所说的,它正在工作,但我想知道是否有一种更简单的方法可以使用渴望加载来实现这一点,以及如何转换

  • 当我说“更容易”时,我指的是更可读、更独立、更正确的方式,而不是大的查询

假设您确实拥有实体的4个雄辩的模型类。 如果是这样的话,您可以尝试通过雄辩的ORM快速加载

$Garages = Garage::with(['cars','places', 'securities'])->get();
然后,您可以使用返回的结果集(一个集合)(illumb\Support\collection),根据需要准备必要的输出。您可以按自己喜欢的方式变换集合中的项。这里有一个例子

在你的情况下,我认为这将是一种方法

$Garages->transform(function($garage) {
   return array(
       'garage_name' => $garage->garage_name,
       'count_cars' => $garage->cars->count(),
       'count_securities' => $garage->securities->count(),
       'count_places' => $garage->places->count(),
       // add as many custom details you want here
   );
});

return $Garages->toArray(); // see the output
现在我希望你明白了

请记住,您的模型类文件应该具有这些关系。应该是这样的

class Garage extends Eloquent {

   public function cars() {
     return $this->hasMany('Car');
   }

   public function securities()
   {
     return $this->hasMany('Security');
   }

   public function places()
   {
     return $this->hasMany('Place');
   }

}

class Car extends Eloquent {

  // relationships here
}

class Security extends Eloquent {

  // relationships here
}

class Place extends Eloquent {

  // relationships here
}
这只是一个帮助您理解的简单示例


享受吧D

假设您确实拥有实体的4个雄辩的模型类。 如果是这样的话,您可以尝试通过雄辩的ORM快速加载

$Garages = Garage::with(['cars','places', 'securities'])->get();
然后,您可以使用返回的结果集(一个集合)(illumb\Support\collection),根据需要准备必要的输出。您可以按自己喜欢的方式变换集合中的项。这里有一个例子

在你的情况下,我认为这将是一种方法

$Garages->transform(function($garage) {
   return array(
       'garage_name' => $garage->garage_name,
       'count_cars' => $garage->cars->count(),
       'count_securities' => $garage->securities->count(),
       'count_places' => $garage->places->count(),
       // add as many custom details you want here
   );
});

return $Garages->toArray(); // see the output
现在我希望你明白了

请记住,您的模型类文件应该具有这些关系。应该是这样的

class Garage extends Eloquent {

   public function cars() {
     return $this->hasMany('Car');
   }

   public function securities()
   {
     return $this->hasMany('Security');
   }

   public function places()
   {
     return $this->hasMany('Place');
   }

}

class Car extends Eloquent {

  // relationships here
}

class Security extends Eloquent {

  // relationships here
}

class Place extends Eloquent {

  // relationships here
}
这只是一个帮助您理解的简单示例


享受吧D

假设您确实拥有实体的4个雄辩的模型类。 如果是这样的话,您可以尝试通过雄辩的ORM快速加载

$Garages = Garage::with(['cars','places', 'securities'])->get();
然后,您可以使用返回的结果集(一个集合)(illumb\Support\collection),根据需要准备必要的输出。您可以按自己喜欢的方式变换集合中的项。这里有一个例子

在你的情况下,我认为这将是一种方法

$Garages->transform(function($garage) {
   return array(
       'garage_name' => $garage->garage_name,
       'count_cars' => $garage->cars->count(),
       'count_securities' => $garage->securities->count(),
       'count_places' => $garage->places->count(),
       // add as many custom details you want here
   );
});

return $Garages->toArray(); // see the output
现在我希望你明白了

请记住,您的模型类文件应该具有这些关系。应该是这样的

class Garage extends Eloquent {

   public function cars() {
     return $this->hasMany('Car');
   }

   public function securities()
   {
     return $this->hasMany('Security');
   }

   public function places()
   {
     return $this->hasMany('Place');
   }

}

class Car extends Eloquent {

  // relationships here
}

class Security extends Eloquent {

  // relationships here
}

class Place extends Eloquent {

  // relationships here
}
这只是一个帮助您理解的简单示例


享受吧D

假设您确实拥有实体的4个雄辩的模型类。 如果是这样的话,您可以尝试通过雄辩的ORM快速加载

$Garages = Garage::with(['cars','places', 'securities'])->get();
然后,您可以使用返回的结果集(一个集合)(illumb\Support\collection),根据需要准备必要的输出。您可以按自己喜欢的方式变换集合中的项。这里有一个例子

在你的情况下,我认为这将是一种方法

$Garages->transform(function($garage) {
   return array(
       'garage_name' => $garage->garage_name,
       'count_cars' => $garage->cars->count(),
       'count_securities' => $garage->securities->count(),
       'count_places' => $garage->places->count(),
       // add as many custom details you want here
   );
});

return $Garages->toArray(); // see the output
现在我希望你明白了

请记住,您的模型类文件应该具有这些关系。应该是这样的

class Garage extends Eloquent {

   public function cars() {
     return $this->hasMany('Car');
   }

   public function securities()
   {
     return $this->hasMany('Security');
   }

   public function places()
   {
     return $this->hasMany('Place');
   }

}

class Car extends Eloquent {

  // relationships here
}

class Security extends Eloquent {

  // relationships here
}

class Place extends Eloquent {

  // relationships here
}
这只是一个帮助您理解的简单示例


享受吧D

它返回
汽车
地方
的总数,但
证券
始终为0。我自己用
hasManyThrough
解决了这个问题-但现在,当我将数组传递给刀片模板时,出现了一个错误:
试图获取非对象的属性。如何解决此问题?请尝试通过对象集合进行调试,以查看是否加载了关系,该错误告诉您,您试图获取的对象->属性在该对象上不可用。它返回
汽车
位置
的总数,但
证券
始终为0。我自己使用
hasManyThrough
解决了该问题但现在,当我将数组传递给刀片模板时,出现了一个错误:
试图获取非对象的属性。如何解决此问题?请尝试通过对象集合进行调试,以查看是否加载了关系,该错误告诉您,您试图获取的对象->属性在该对象上不可用。它返回
汽车
位置
的总数,但
证券
始终为0。我自己使用
hasManyThrough
解决了该问题但现在,当我将数组传递给刀片模板时,出现了一个错误:
试图获取非对象的属性。如何解决此问题?请尝试通过对象集合进行调试,以查看是否加载了关系,该错误告诉您,您试图获取的对象->属性在该对象上不可用。它返回
汽车
位置
的总数,但
证券
始终为0。我自己使用
hasManyThrough
解决了该问题但现在,当我将数组传递给刀片模板时,出现了一个错误:
试图获取非对象的属性。如何解决此问题?请尝试通过对象集合进行调试,以查看是否加载了关系,错误会告诉您,您尝试获取的object->属性在对象上不可用。