2017-09-19 1 views
1

Je suis coincé dans la construction d'une requête où je dois sélectionner des éléments du tableau 1 si la condition est remplie sur la table 2 et la table 3.Laravel [QUERY] comment sélectionner le contenu du tableau 1 où la condition doit se rencontrer dans le tableau 2 et le tableau 3

J'ai ces trois tableaux:

company -> company_id, name, location 

services -> company_id, service_id, service_name 

date -> service_id, service_date //should i include company_id here? 

Je veux sélectionner société -> nom et l'emplacement si les matches de recherche services-> nom_du_service et date-> service_date.

Comment joindre les tables pour obtenir le résultat souhaité?

+0

Qu'est-ce que vous vous déjà essayé de le faire? Veuillez consulter [Comment poser une bonne question] (https://stackoverflow.com/help/how-to-ask). Votre question doit inclure un aperçu clair de votre problème de * codage * spécifique, un résumé de ce que vous avez déjà essayé et le code approprié dans un [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve), nous avons donc assez d'informations pour pouvoir vous aider. – FluffyKitten

+0

Vous ne devriez pas avoir une table uniquement dans le but de stocker un horodatage (c'est-à-dire se débarrasser de la table 'date'). Faites du champ 'service_date' une partie de la table' services' et joignez 'company' et' services' sur 'company_id' avec une clause WHERE qui spécifie une plage de dates et/ou un' service_name'. – chb

+0

@chb Mais un service peut avoir plusieurs dates, et il y a aussi un temps associé, donc je pense que la normalisation est nécessaire. – zuif

Répondre

1

Ce n'est pas testé, mais ce sera quelque chose comme ce qui suit:

$query = Company::query() 
    ->select(['company.name','company.location']) 
    ->leftJoin('services', 'services.company_id', '=', 'company.company_id') 
    ->leftJoin('date', 'date.service_id', '=', 'services.service_id') 
    ->where('services.service_name', $servicename) 
    ->where('date.service_date', $servicedate); 
+0

Merci, j'ai dû faire quelques ajouts, mais merci, vous étiez le seul à me répondre, et ça m'a beaucoup aidé :) – zuif