2015-06-25 15 views
8

Quindi, sto ricevendo il seguente errore da laravel:SQLSTATE [42000]: Errore di sintassi o violazione di accesso: 1066 tabella Non unico/alias sul rapporto

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)) 

mio messaggio/partecipanti relatioship si presenta così:

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

e sto provando a chiamare in questo modo:

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

Perche 'si ottengono questo errore? Cosa sta succedendo?

Modifica: Incluso modelli full

Messaggio classe Message estende Eloquente { uso PublishedTrait; usa SoftDeletingTrait;

/** 
    * 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.*'); 
    } 

} 

Partecipante

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')); 
    } 
} 

risposta

6

con risposta tramite il Larachat Slack ufficiale:

La relazione non è presente una tabella pivot per questo lavoro. Il secondo argomento nel metodo participants è la tabella pivot da utilizzare:

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

Pertanto, non è possibile utilizzare i partecipanti come il perno, perché è uno dei tavoli nella relazione, è necessario un tavolo message_participant pivot.

+1

** Nota ** Il primo parametro è il nome del modello che si desidera, non il nome della tabella/modello pivot. Miscelazione che generava un errore simile. –

2

Il tuo errore è

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

È necessario fornire alias per ogni riferimento, come in

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

e quindi utilizzare p1 e p2 nei posti giusti, ad esempio

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

(sto cercando di indovinare su quale sia p1 e che è p2; si deve fare che la determinazione)

+0

sì, capisco quella parte, il problema è che sto usando una relazione eloquente standard, e ho pensato che ha funzionato:/ – ChrisBratherton

+2

come definire questo alias usando la sintassi eloquente? – Tom

+3

Questa era una domanda su relazioni eloquenti in laravel, non su come fare sql joins e alias. –

Problemi correlati