我有一个赞助商表,它将包含以下列:
id
name
country我有一个clinical_trials表,它将包含以下列:
id
name
status
country我有一个sponsor_to_clinical_trials表,如下所示:
sponsor_id (fk to sponsors table)
clinical_trial_id (fk to clinical_trials table)赞助商将能够有许多临床试验,例如,给定的sponsor_id将在sponsor_to_clinical_trials表中多次出现。
我的问题可能很基本,但我只使用了模型关系,即我返回一个项,然后使用该关系。
我不确定这样的事情是否会奏效:
SponsorToClinicalTrial::where(sponsor_id,auth::guard(‘发起人’)) -->临床试验-->合同-->get()
SponsorToClinicalTrial::where(sponsor_id,auth::guard(‘赞助商’))将返回一个集合,并且将在名为clinicalTrials的SponsorToClinicalTrial模型上存在一个'belongsTo‘关系,该关系将用于临床试验。
我知道如果SponsorToClinicalTrial::where(sponsor_id,auth::guard(‘赞助商’))只返回一行,这将会起作用,但如果它返回多行,我不知道是否可以使用它
发布于 2020-09-23 09:46:04
您的表结构表明,通过sponsor_to_clinical_trials在sponsors和clinical_trials之间存在多对多关系。一个基本的belongsToMany关系可能就是你想要的。
Sponsor模型与ClinicalTrial模型具有belongsToMany关系。而且,ClinicalTrial模型将有一个带有Sponsor模型的belongsToMany。
class Sponsor extends Model{
public function clinicalTrials(){
return $this->belongsToMany(ClinicalTrial::class, 'sponsor_to_clinical_trials');
}
}
class ClinicalTrial extends Model{
public function sponsors(){
return $this->belongsToMany(Sponsor::class, 'sponsor_to_clinical_trials');
}
}现在,您可以获得相关临床试验的所有赞助商,或获得相关临床试验的单个赞助商。临床试验也是如此。
//use App\ClinicalTrial; use App\Sponsor;
$sponsorsWithClinicalTrials = Sponsor::with('clinicalTrials')->get(); //list (collection) of sponsors with related clinical trials
$clinicalTrialsWithSponsors = ClinicalTrial::with('sponsors')->get(); //list of clinical trials with related sponsors
$singleSponsorWithClinicalTrials = Sponsor::where(id, auth::guard('sponsor'))->with('clinicalTrials')->get(); //your example, assuming auth::guard('sponsor') holds a sponsor id.
//$singleSponsorWithClinicalTrials->clinicalTrials would give you the collection of clinical Trials belonging to that sponsor有关Laravel的多对多实现的更多信息:https://laravel.com/docs/8.x/eloquent-relationships#many-to-many
发布于 2020-09-23 09:46:04
如何在赞助商和试验之间建立BelongsToMany关系:
class Sponsor extends Model
{
public function clinicals()
{
return $this->belongsToMany(ClinicalTrial::class, 'sponsor_to_clinical_trials');
}
}然后,您可以使用flatMap和higher order messages以这种方式访问contracts
$sponsor->clinicalTrials->flatMap->contracts;
//or
$sponsors->flatMap->clinicalTrials->flatMap->contracts;
//This is similar to the second example but more performant.
$sponsors->load('clinicalTrials.contracts')->flatMap->clinicalTrials->flatMap->contracts;https://stackoverflow.com/questions/64019447
复制相似问题