вы можете создать два разных отношения.
public function maleReproductions(){
return $this->hasMany(Reproduction::class, 'father_id');
}
public function feMaleReproductions(){
return $this->hasMany(Reproduction::class, 'mother_id');
}
теперь на основе $user
вы можете прикрепить отношения.
$productions = [];
$user = User::where('id',1)->first();
if($user->gender == 'm'){
$productions = $user->maleProductions;
} else {
$productions = $user->feMaleProductions;
}
для сбора пользователей, прикрепите оба отношения. и укажите спецификацию c в зависимости от условия.
$users = User::with('maleReproductions', 'femaleReproductions')->get();
foreach($users as $user){
if($user->gender == 'm'){
$productions = $user->maleProductions;
} else {
$productions = $user->feMaleProductions;
}
}