The validator in laravel can have a customization of the exists database rule, for instance if you need to check an extra column. An example from the manual:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
The query
in the closure is not typehinted, so i'm not quite positive what kind of object this is. I can see that the DatabaseRule
itself only has some function about where
, wherenot
etc, but i'm looking to add a join to the mix.
Given example says that the email must exist for a staff with account_id = 1
, but what if the team (all staff are part of a team, which is a separte table) should have a certain property, e.g. team.active = 1
?
the whole staff/team thing is an example of course
So in the end I'm wondering: how can I add a join to this rule so we make sure that the staff's team has a column 'active' that is 1.
My first issue might be: what is the type of that $query
? I would imagine that something like this would be great, but there's no reason to suspect this is valid:
Rule::exists('staff')->where(function ($query) {
$query
->join('team', 'team.team_id', '=', 'staff.team_id')
->where('team.active', 1);
})
This does not seem to work. The strange thing is that the join itself does not cause an error, but seems to be ignored:
Column not found:
1054 Unknown column 'team.active' in 'where clause'
(SQL: select count(*) as aggregate fromstaff
whereteam
.active
= 1))
I would have expected this to work (small change as I'm gambling that this function is available here), or get an error because I'm calling a non-existent function. But what I get is a query that is build but without the join.
From the comments I added a $query->toSQL()
to that function. This does show a rather expected result, but it does not compute with the error I'm getting:
select * from `staff`
inner join `teams` on `teams`.`team_id` = `staff`.`team_id`
where `teams`.`active` = ?
$query->toSql()
from inside the rule closure and see what you get. The$query
is an instance ofIlluminate\Database\Query\Builder
, so you should have no problems making that join. – Inchcount
aggregation to see if there is a result, and it has lost it? Not sure how that works. – Laminous