2017-09-19 1 views
1

Je crée une API pour une application Web. L'une des routes personnalisées que je construis peut être utilisée pour obtenir tous les rapports de la base de données qui utilisent un ensemble de données à partir d'un emplacement spécifique. En ce moment, cette route est un peu un goulot d'étranglement et j'essaie d'accélérer les choses.Obtient l'objet de la base de données par le champ Objet de la relation many-to-many

Un rapport peut contenir plusieurs ensembles de données. Les données peuvent également appartenir à plusieurs rapports. La table de données contient tous les emplacements d'ensembles de données d'une autre base de données (externe).

Pour clarifier ma base de données ressembler à ceci:

Report    pivot table   Data 
|-----------|  |-----------|  |-------------| 
| Report_id |-------<| Report_id |>-------| Data_id  | 
|   |  | Data_id |  | Location_id | 
|-----------|  |-----------|  |-------------| 

J'ai écrit le script suivant pour obtenir tous les rapports à l'aide d'un certain jeu de données, mais je me sens comme cela peut se faire de manière plus efficace. Est-ce que je manque quelque chose d'évident ici ou est-ce la meilleure façon d'y arriver?

Répondre

1

dans les modèles

Data.php

public function Report() 
{ 
return $this->hasMany('App\Report'); 
} 

Report.php

public function Data() 
{ 
return $this->belongsToMany('App\Data'); 
} 

(vous pouvez aussi donner que tous les champs doivent venir dans la requête de sélection) et dans le contrôleur

// To get reports which are having any data 
$reports1 = Report::whereHas('Data',function($query) use($id){ 
    $query->select('id'); 
    $query->where('location_id',$id); 
})->orderBy('id', 'desc') 
    ->get(); 

// To get all reports 

$reports2 = Report::with(array('Data'=>function($query)use($id){ 
    $query->select('id'); 
    $query->where('location_id',$id); 
}))->orderBy('id', 'desc') 
    ->get(); 
+0

Que ks pour votre réponse! C'est certainement une façon plus agréable de le faire, même si je ne vois pas un gros avantage en termes de performance. Je vais utiliser ceci pour le moment cependant. – Edwardo

+0

donnant des relations correctes et en utilisant ORM (au lieu de la requête DB) rendra votre code facile, lorsque le projet se développe. Des requêtes plus complexes peuvent être simplifiées en utilisant 'with()'. Si la réponse semble être utile. SVP marquer comme correct –

+0

par exemple. $ data ['application'] = Application :: with ('ApplicationType') -> avec ('ApplicationChild') -> avec ('ApplicationChild.District') -> avec ('ApplicationChild.ElectricalSection') - > with ('ApplicationContractorSupervisorMaster') -> avec ('ApplicationContractorSupervisorMaster.ContractorSupervisor') -> avec ('District') -> first(); –