2017-10-05 9 views
2

J'ai 3 tables/modèlesLaravel obtenir des commandes assignées à mon utilisateur (avec l'histoire des missions)

  1. utilisateur (id)
  2. commande (id)
  3. missions (order_id, user_id, created_at)

L'administrateur peut affecter un ordre à un utilisateur, puis le réattribuer et je dois stocker cet historique.

Par exemple, j'ai

Users 

----+ 
id | 
----+ 
1 | 
----- 
2 | 
----+ 

Orders 

----+ 
id | 
----+ 
1 | 
----+ 
2 | 
----+ 

Assignments 

------------------------------------ 
id | user_id | order_id | created_at 
------------------------------------ 
3 | 2  | 1  | 10.10.2010 
------------------------------------ 
2 | 1  | 1  | 09.10.2010 
------------------------------------ 
1 | 1  | 2  | 09.10.2010 

Maintenant, je veux obtenir des commandes assignées à l'utilisateur avec id = 1 et logiquement je dois obtenir l'ordre avec id = 2 parce que l'ordre avec id = 1 a été réaffecté à l'utilisateur avec id = 2 le 10.10.2010

J'utilise Laravel 5.4 avec Eloquent.

S'il vous plaît me aider avec requête SQL ou une relation Eloquent (je veux avoir une relation de assignedOrders pour le modèle de mon utilisateur)

+0

Pourquoi ajouter ne pas vous deleted_at et si l'administrateur réattribuer la ordonnez le champ removed_at et ensuite dans votre requête si vous voulez que même les réaffectés ajoutent 'withTrashed()' sinon il renverra juste les ordres assignés en cours !! – Maraboc

+0

J'ai une autre solution de travail mais je me demande comment vous pouvez résoudre ce problème sans aucune modification – Aram810

Répondre

1

Je suggère une modification à votre table d'affectations.

Vous devez ajouter un champ status qui servira comme suit (en attente, actif, réaffecté, terminé). En fait, vous devriez créer une nouvelle table pour stocker cela, mais pour un exemple rapide, gardons cela.

De cette façon, vous pouvez conserver un historique de tous les ordres. Cela aidera également si, pour une raison quelconque, l'administrateur réattribue la commande de l'utilisateur A à l'utilisateur B, puis la réattribue à l'utilisateur A.

En faisant cela, votre requête pour obtenir l'utilisateur en cours avec l'ordre 1 serait:

Assignments::where('order_id', 1)->where('status', 'active')->first(); 

Pour avoir une histoire de l'Ordre, la requête suivante peut être utilisée:

Assignments::where('order_id', 1)->orderBy('created_at')->get(); 

Cela afficherait toute la commande avec le statut.

------------------------------------------------- 
id | user_id | order_id | status  | created_at 
------------------------------------------------- 
3 | 5  | 1  | active  | 10.15.2010 
------------------------------------------------- 
2 | 2  | 1  | reassigned | 09.11.2010 
------------------------------------------------- 
1 | 1  | 1  | reassigned | 09.10.2010 

Il est évident que, chaque fois que l'administrateur change l'état d'une commande, vous devez mettre à jour le champ d'état, puis créer une nouvelle ligne sur Assignments tableau

+0

oui c'est la meilleure façon, et je l'ai déjà fait de cette façon, mais pour l'intérêt je veux savoir comment résoudre ce problème sans modification. – Aram810

0

Trier votre requête avec:

orderBy('created_at', 'desc')->firstOrFail(); 

assurez-vous que vous utilisez des relations correctes dans votre modèle tel que a beaucoup ou appartient à Docs here.