2015-06-25 11 views
8

Also, ich bin den folgenden Fehler von Laravel Empfang:SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1066 Nicht eindeutige Tabelle/Alias ​​auf Beziehung

SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'participants' (SQL: select `participants`.*, `participants`.`message_id` as `pivot_message_id`, `participants`.`user_id` as `pivot_user_id`, `participants`.`created_at` as `pivot_created_at`, `participants`.`updated_at` as `pivot_updated_at` from `participants` inner join `participants` on `participants`.`id` = `participants`.`user_id` where `participants`.`deleted_at` is null and `participants`.`message_id` in (2)) 

Meine Botschaft/Teilnehmer relatioship sieht wie folgt aus:

public function participants() 
    { 
     return $this->belongsToMany('Namespace\Modules\Email\Models\Participant', 'participants', 'message_id', 'user_id')->withTimestamps(); 
    } 

und ich versuche, es so zu nennen:

public function getAllMessages() 
{ 
    return Message::with('user')->with('participants')->get(); 
} 

Warum bin ich diesen Fehler? Was ist los?

Edit: inklusive Voll Modelle

Nachricht Klasse Nachricht erweitert Eloquent { Verwendung PublishedTrait; SoftDeletingTrait verwenden;

/** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'messages'; 

    /** 
    * The attributes that can be set with Mass Assignment. 
    * 
    * @var array 
    */ 
    protected $fillable = ['subject', 'user_id', 'body', 'status']; 

    /** 
    * The attributes that should be mutated to dates. 
    * 
    * @var array 
    */ 
    protected $dates = ['created_at', 'updated_at', 'deleted_at']; 

    /** 
    * Validation rules. 
    * 
    * @var array 
    */ 
    protected $rules = [ 
     'subject' => 'required|max:255', 
     'body' => 'required', 
    ]; 

    /** 
    * User relationship 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function user() 
    { 
     return $this->belongsTo(Config::get('email.user_model')); 
    } 

    public function assets() 
    { 
     return $this->belongsToMany('Namespace\Modules\Assets\Models\Asset', 'message_assets'); 
    } 

    /** 
    * Participants relationship 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\HasMany 
    */ 
    public function participants() 
    { 
     return $this->belongsToMany('Namespace\Modules\Email\Models\Participant', 'participants', 'message_id', 'user_id')->withTimestamps(); 
    } 

    /** 
    * Recipients of this message 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\HasMany 
    */ 
    public function recipients() 
    { 
     return $this->participants()->where('user_id', '!=', $this->user_id); 
    } 

    /** 
    * Returns the latest message from a thread 
    * 
    * @return Namespace\Modules\Email\Models\Message 
    */ 
    public function getLatestMessageAttribute() 
    { 
     return $this->messages()->latest()->first(); 
    } 

    /** 
    * Returns threads that the user is associated with 
    * @param $query 
    * @param $userId 
    * @return mixed 
    */ 
    public function scopeForUser($query, $userId) 
    { 
     return $query->join('participants', 'messages.id', '=', 'participants.message_id') 
      ->where('participants.user_id', $userId) 
      ->where('participants.deleted_at', null) 
      ->select('messages.*'); 
    } 

    /** 
    * Returns threads that the user is associated with 
    * @param $query 
    * @param $userId 
    * @return mixed 
    */ 
    public function scopeForUserWithDeleted($query, $userId) 
    { 
     return $query->join('participants', 'messages.id', '=', 'participants.message_id') 
      ->where('participants.user_id', $userId) 
      ->select('messages.*'); 
    } 

    /** 
    * Returns messages that the user has sent 
    * @param $query 
    * @param $userId 
    * @return mixed 
    */ 
    public function scopeByUser($query, $userId) 
    { 
     return $query->where('user_id', $userId); 
    } 

    /** 
    * Returns threads with new messages that the user is associated with 
    * @param $query 
    * @param $userId 
    * @return mixed 
    */ 
    public function scopeForUserWithNewMessages($query, $userId) 
    { 
     return $query->join('participants', 'messages.id', '=', 'participants.message_id') 
      ->where('participants.user_id', $userId) 
      ->whereNull('participants.deleted_at') 
      ->where(function ($query) { 
       $query->where('messages.updated_at', '>', $this->getConnection()->raw($this->getConnection()->getTablePrefix() . 'participants.last_read')) 
        ->orWhereNull('participants.last_read'); 
      }) 
      ->select('messages.*'); 
    } 

} 

Teilnehmer

class Participant extends Eloquent 
{ 
    use SoftDeletingTrait; 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'participants'; 

    /** 
    * The attributes that can be set with Mass Assignment. 
    * 
    * @var array 
    */ 
    protected $fillable = ['message_id', 'user_id', 'last_read']; 

    /** 
    * The attributes that should be mutated to dates. 
    * 
    * @var array 
    */ 
    protected $dates = ['created_at', 'updated_at', 'deleted_at', 'last_read']; 

    /** 
    * Thread relationship 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function message() 
    { 
     return $this->hasMany('Namespace\Modules\Email\Models\Message'); 
    } 

    /** 
    * User relationship 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function user() 
    { 
     return $this->belongsTo(Config::get('email.user_model')); 
    } 
} 

Antwort

6

über die Larachat offiziellen Slack Beantwortet:

Die Beziehung für diese eine Pivot-Tabelle fehlt zu arbeiten. Das zweite Argument in der participants Methode ist die Pivot-Tabelle zu verwenden:

public function participants() 
{ 
    return $this->belongsToMany('Namespace\Modules\Email\Models\Participant', 'PIVOT', 'message_id', 'user_id')->withTimestamps(); 
} 

Daher kann die Teilnehmer nicht als Drehpunkt verwenden, da es eine der Tabellen in der Beziehung ist, müssen Sie eine message_participant Pivot-Tabelle.

+1

** Hinweis ** Der erste Parameter ist der Name des gewünschten Modells, nicht der Name der Pivot-Tabelle/des Pivot-Modells. Mischen würde einen ähnlichen Fehler auslösen. –

2

Ihr Fehler ist

...from `participants` inner join `participants` ... 

Sie müssen Aliase für jeden Hinweis liefern, wie in

...from `participants` p1 inner join `participants` p2 ... 

und verwenden Sie dann p1 und p2 an den richtigen Stellen, zum Beispiel

...on p1.`id` = p2.`user_id` ... 

(I, auf das ich raten ist p1 und das ist p2; Sie müssen diese Feststellung)

+0

Ja, ich verstehe diesen Teil, das Problem ist, dass ich eine standard eloquente Beziehung verwende, und ich dachte, dass gerade funktioniert:/ – ChrisBratherton

+2

wie diesen Alias ​​mit der eloquenten Syntax zu definieren? – Tom

+3

Dies war eine Frage über eloquente Beziehungen in Laravel, nicht wie SQL-Joins und Aliase zu tun. –

Verwandte Themen