Laravel: создание отношения HasMany на основе условия - PullRequest
0 голосов
/ 24 марта 2020

Мне нужно отобразить репродукции с учетом гендерных условий

Таблица репродукций:

$table->bigIncrements('id');
$table->unsignedInteger('father_id');
$table->unsignedInteger('mother_id');
...

Мне нужно получить репродукции в соответствии с полом

Пользователь. php

public function reproductions(){
    if($this->gender == 'm'){
        return $this->hasMany(Reproduction::class, 'father_id');
    }else{
        return $this->hasMany(Reproduction::class, 'mother_id');
    }
}

Таблица воспроизведения:

id    father_id    mother_id

1         1            2

2         1            3

3         1            4

Когда я получаю воспроизведение для Пользователя с идентификатором 1, необходимо отобразить 3 копии, но возвращается нулевая коллекция

$firstUser = User::find(1); // User Id with 1 has gender m

dd($firstUser->reproductions->count()); // Should return 3 but returns null collection

1 Ответ

2 голосов
/ 24 марта 2020

вы можете создать два разных отношения.

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;
    }
}
...