How do I use join with Eloquent taking in consideration the following table structure:
I have a properies table
--------------------- ID | Name --------------------- 1 | Property Name
than I have rooms
---------------------- RoomID | Property ---------------------- A-212 | 1 ---------------------- F-1231 | 1
here Property is the foreign key than I want to get all Properties and count how many rooms do they have each
The query which retrives all looks like
class PropertiesRepository extends EloquentBaseRepository implements PropertiesInterface
{
use TaggableRepository;
/**
* Construct
* @param Properties $properties
*/
public function __construct( Properties $properties )
{
$this->model = $properties;
}
/**
* Get all properties joining rooms
* @return Properties
*/
public function getAll()
{
return $this->model->get();
}
}
How do I extend this query to get the desired result?
Advertisement
Answer
This is more of a MySQL join+group+select trick which includes following steps.
- Join your relation table(use
joinif you want to exclude rows withRoomsCount=0, else useleftJoin) - Use
groupByby primaryKey to avoid duplicates of the join. - Select
countof joined table
$this->model->leftJoin('Rooms', 'Properties.ID', '=', 'Rooms.Property')
->selectRaw('Properties.*, count(Rooms.RoomID) as RoomsCount')
->groupBy('Properties.ID')
->get();