
クエリビルダはあまり使わないのだけど、レコードの有無を取得する場合や集計処理なんかでは使うことがある🐱
生クエリがこうだとする
select
*
from
`employee_emails`
left join `employee_skills` on `employee_skills`.`employee_email_id` = `employee_emails`.`id`
and `employee_skills.`name` = "Engineer" left join `user_account_register_email_settings` on `user_account_register_email_settings`.`employee_email_id` = `employee_emails`.`id` where `employee_emails`.`id` = 65 and (`employee_skills`.`employee_email_id = 65 or `user_account_register_email_settings`.`employee_email_id` = 65) limit 1
JOINはLEFT JOINとINNER JOINの違いを意識して使おう🐱
- INNER JOIN … &&での結合
- LEFT JOIN … || での結合。&&ではない箇所はnullで結合される
クエリビルダだとこうなる
namespace App\Repositories\Employee;
use App\Entities\EmployeeEmail;
use App\Repositories\Traits\ResourceConstructTrait;
class EmployeeEmailRepository implements EmployeeEmailInterface
{
use ResourceConstructTrait;
public function __construct(EmployeeEmail $resource)
{
$this->resource = $resource;
}
public function isEngineer(int $id): bool
{
// クエリビルダー開始
$query = $this->resource->query();
$query->leftJoin('employee_skills', function ($join) {
$join->on(
'employee_skills.employee_email_id',
'=',
'employee_emails.id'
);
$join->where('employee_skills.name', 'engineer');
});
$query->leftJoin('user_account_register_email_settings', function ($join) {
$join->on(
'user_account_register_email_settings.employee_email_id',
'=',
'employee_emails.id'
);
});
$query->where('employee_emails.id', $id);
$query->where(function ($query) use ($id) {
$query->where('employee_skills.employee_email_id', $id)
->orWhere('user_account_register_email_settings.employee_email_id', $id);
});
// レコードがあるかで判定
return is_null($query->first()) ? false : true;
}
}

