2

laravel의 유효성 검사기는 예를 들어 추가 열을 검사해야하는 경우와 같이 존재 데이터베이스 규칙의 사용자 지정을 가질 수 있습니다. the manual의 예는 :래벨 유효성 검사기에 대한 사용자 정의 존재 규칙에 조인을 추가하려면 어떻게합니까?

use Illuminate\Validation\Rule; 

Validator::make($data, [ 
    'email' => [ 
     'required', 
     Rule::exists('staff')->where(function ($query) { 
      $query->where('account_id', 1); 
     }), 
    ], 
]); 

폐쇄의 query는 그래서 난이이 객체의 어떤 종류의 매우 긍정적 인 아니에요, typehinted되지 않습니다. 나는 DatabaseRule 그 자체가 where, wherenot 등등에 대해서만 약간의 기능을 가지고 있음을 볼 수있다. 그러나 나는 혼합에 조인을 추가하려고한다.

예를 들어 account_id = 1의 직원에 대한 이메일이 있어야한다고 나와 있지만 팀 (모든 직원이 separte 테이블 인 팀에 속해있는 경우)이 특정 속성 (예 : team.active = 1? 그래서 우리는 직원의 팀이 있는지 확인 방법 나는이 규칙에 가입 추가 할 수 있습니다
전체 직원은/팀 것은 내가 궁금하네요 결국


그래서 물론의 예입니다 '활성'열은 1입니다.

내 첫 번째 문제 일 수 있습니다 : 그 유형은 $query입니까?이 같은 일이 잘 될 것이라고 상상하지만,이 유효 의심 할 이유가 없습니다 :

Rule::exists('staff')->where(function ($query) { 
    $query 
     ->join('team', 'team.team_id', '=', 'staff.team_id') 
     ->where('team.active', 1); 
}) 

이 작동하지 않습니다. 이상한 것은이 오류가 발생하지 않습니다 자체 조인,하지만 무시하는 것 같다

열을 찾을 수 없습니다 :
에서 1054 알 수없는 열 'team.active' 'where 절'
(SQL : staff에서 집계로 계산 (*)을 선택 곳 email = -thevalue-와 (team. active = 1) 나는이 기능을 사용할 수 있는지 도박 해요로 나는이 (작은 변화가 일 것으로 예상했을 것이다

) 여기), 존재하지 않는 함수를 호출하기 때문에 오류가 발생합니다. 그러나 내가 얻는 것은 빌드이지만 조인이없는 쿼리입니다.

의견에서 나는 해당 기능에 $query->toSQL()을 추가했습니다. 이것은 오히려 예상 된 결과를 보여 않지만, 내가지고있어 오류로 계산하지 않습니다

select * from `staff` 
inner join `teams` on `teams`.`team_id` = `staff`.`team_id` 
where `teams`.`active` = ? 
+0

시도 VAR 덤프'$ 질의 -> toSql()'에 당신이 얻는 것. '$ query'는'Illuminate \ Database \ Query \ Builder'의 인스턴스이므로, 조인하는데 아무런 문제가 없어야합니다. – TheFallen

+0

사용자 지정 유효성 검사 규칙은 무엇입니까 ?? [doc here] (https://laravel.com/docs/5.5/validation#custom-validation-rules) – Maraboc

+0

@Maraboc 예, 그건 대체 될 것이지만 이것이 가장 읽기 쉽고/좋은 방법이라고 생각했습니다. 그것. – Nanne

답변

1

DatabaseRule 당신이 그 폐쇄에서 제공하는 어떤 몇 가지 마법을 수행 보인다. 결국에는 제공된 where 절만 볼 수 있습니다 (Exists::__toString 참조). 조인은 클로저 쇼의 반향으로 저장되었지만 기존 규칙은 어디에서만 볼 수 있습니다. 이것이 알 수없는 열 오류의 이유입니다.

나는 where에 더 잘 맞는 것처럼 보이는 using 함수를 시도했지만, 시스템이 그것을 문자열로 만드는 것처럼 도움이되지는 않는다. 조인을 지원하는 것 같습니다.

길고도 짧은 이야기, 난 그냥이 같은 passes 기능을 찾고 뭔가 사용자 지정 유효성 검사 규칙을 만들어 : 규칙 폐쇄 내부와 볼에서

public function passes($attribute, $value) 
{ 
    $count = DB::table('staff') 
     ->join('teams', 'teams.team_id', '=', 'staff.team_id') 
     ->where([ 
      ['teams.active', '=', 1], 
      ['staff.email', '=', $value] 
     ])->count(); 

    return $count > 0; 
}