mercredi 11 octobre 2017

How can I add a join to a custom exists rule for a laravel validator?

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 from staff where email = -thevalue- and (team.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.



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire