2017-09-21 4 views
0

Je suis en train de construire une petite application dans laravel 5.4 où je vais avoir une table contacts, table companies, table interactions et users tableau chacun avec leurs modèles respectifs. Un Interaction est créé par le User où il y a client_contact, contact, user participant. Chaque client_contact et contact partage le même modèle et appartient à une entreprise qui a le type dans sa colonne par exemple Investisseur, Recherche, Corporate etc. Maintenant j'essaye de générer un rapport où l'interaction est faite par un utilisateur avec des Investisseurs. Tout d'abord, laissez-moi vous montrer mes modèles:données relationnelles en Extraction Laravel

Modèle utilisateur:

class User extends Authenticatable 
{ 
    use HasApiTokens, Notifiable, SoftDeletes; 


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

    public function clients() 
    { 
     //Each user has been assigned a particular client 
     return $this->belongsToMany('App\Company', 'company_user', 'user_id', 'company_id'); 
    } 

} 

Contacts Modèle:

class Contact extends Model 
{ 
    use SoftDeletes, DataViewer; 

    public function company() 
    { 
     return $this 
      ->belongsToMany('App\Company', 'company_contact','contact_id', 'company_id')->withTimestamps(); 
    } 

    public function interactions() 
    { 
     return $this->belongsToMany('App\Interaction', 'contact_interaction','contact_id', 'interaction_id'); 
    } 

    public function clientInteractions() 
    { 
     return $this->belongsToMany('App\Interaction', 'contact_client_interaction','contact_id', 'interaction_id'); 
    } 
} 

Société Modèle:

class Company extends Model 
{ 
    use SoftDeletes, DataViewer; 

    public function contacts() 
    { 
     return $this->belongsToMany('App\Contact', 'company_contact', 'company_id','contact_id'); 
    } 

    public function users() 
    { 
     return $this->belongsToMany('App\User', 'company_user', 'company_id', 'user_id')->withTimestamps(); 
    } 

} 

Interaction Modèle:

class Interaction extends Model 
{ 
    use SoftDeletes; 

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

    public function clientsAssociation() 
    { 
     return $this->belongsToMany('App\Contact', 'contact_client_interaction', 'interaction_id', 'contact_id')->withPivot('company_id')->withTimestamps(); 
    } 

    public function contactsAssociation() 
    { 
     return $this->belongsToMany('App\Contact', 'contact_interaction', 'interaction_id', 'contact_id')->withPivot('company_id')->withTimestamps(); 
    } 

    public function user() 
    { 
     return $this->belongsTo('App\User'); 
    } 

} 

Maintenant, dans mon ReportController: que je fais quelque chose comme ceci:

public function getAnalystInvestor(Request $request) 
{ 
    $user = User::find($request->id); 
    $interactions = Interaction::whereHas('contactsAssociation', function ($query3) { 
     $query3->whereHas('company', function ($query4) { 
      $query4->where('type', 'like', '%'.'Investor'.'%'); 
     }); 
    })->whereHas('user', function ($query1) use($user) { 
     $query1->where('name', '=', $user->name); 
    })->orWhereHas('stellarParticipants', function ($query2) use($user) { 
     $query2->where('name', '=', $user->name); 
    }) 
    ->orderBy('created_at', 'desc') 
    ->take(50) 
    ->with(['contactsAssociation', 'clientsAssociation', 'stellarParticipants']) 
    ->get(); 

    return response()->json(['interactions' => $interactions], 200); 

} 

Mais je suis incapable d'obtenir les résultats escomptés, encore un peu de les données montrent qui n'est pas des investisseurs. J'ai également essayé:

$interactions = Interaction::whereHas('user', function ($query1) use($user) { 
     $query1->where('name', '=', $user->name); 
    })->orWhereHas('stellarParticipants', function ($query2) use($user) { 
     $query2->where('name', '=', $user->name); 
    })->whereHas('contactsAssociation', function ($query3) { 
     $query3->whereHas('company', function ($query4) { 
      $query4->where('type', 'like', '%'.'Investor'.'%'); 
     }); 
    }) 

Lorsque les filtres utilisateur sont affectés en premier mais ne sont pas affichés comme souhaité. Aidez-moi avec ça.

+0

Créez simplement une vue SQL et créez un modèle forit. Vous rencontrez des problèmes de performance avec la quantité de requêtes créées avec ORM –

Répondre

0

Vous devriez être en mesure de la chaîne de votre requête, semblable à ceci:

$cfs = \App\Service::with('items', 'required_services', 'supported_services') 
     ->where(function ($query) { 
      $query->where('stm', 11) 
       ->orWhere('stm', 17) 
       ->orWhere('stm', 31); 
     }) 
     ->where('lifecycle_id', '!=', 12) 
     ->where('type', 'Customer Facing') 
     ->orderBy('service_full_name') 
     ->get(); 

Je ne comprends pas vraiment le rapport que vous développez, mais nous espérons que cela vous aide.