Since your rules are model properties, you need to make some changes for them before starting the validator.
You can change your rules to:
public $rules = array( 'game_id' => 'required|exists:games,id', 'team1_id' => 'required|exists:teams,id,game_id,{$game_id}', 'team2_id' => 'required|exists:teams,id,game_id,{$game_id}' );
and now you will need to use a loop to insert the correct value instead of the line {$game_id} .
I can show you how I did this in my case for the editing rule:
public function validate($data, $translation, $editId = null) { $rules = $this->rules; $rules = array_intersect_key($rules, $data); foreach ($rules as $k => $v) { $rules[$k] = str_replace('{,id}',is_null($editId) ? '' : ','.$editId , $v); } $v = Validator::make($data, $rules, $translation); if ($v->fails()) { $this->errors = $v->errors(); return false; } return true; }
You can do the same in your case by changing {$game_id} to $data['game_id'] (in my case I changed {,id} to ,$editId
EDIT
Of course, if you did not have $rules set as a property, which you could just do:
$rules = array( 'game_id' => 'required|exists:games,id', 'team1_id' => 'required|exists:teams,id,game_id,'.$data['game_id'], 'team2_id' => 'required|exists:teams,id,game_id,'.$data['game_id'] );
where do you have the data set.