SQLSTATE[42000]: синтаксическая ошибка или нарушение доступа: 1066 не уникальная таблица / псевдоним в отношениях

Итак, я получаю следующую ошибку от Laravel:

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

мое сообщение / участники relatioship выглядит так:

public function participants()
    {
        return $this->belongsToMany('NamespaceModulesEmailModelsParticipant', 'participants', 'message_id', 'user_id')->withTimestamps();
    }

и я пытаюсь назвать это так:

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

почему я получаю эту ошибку? Что происходит?

Edit: включены полные модели

сообщение класса расширяет Eloquent { использовать PublishedTrait; использовать 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 IlluminateDatabaseEloquentRelationsBelongsTo
     */
    public function user()
    {
        return $this->belongsTo(Config::get('email.user_model'));
    }

    public function assets()
    {
        return $this->belongsToMany('NamespaceModulesAssetsModelsAsset', 'message_assets');
    }

    /**
     * Participants relationship
     *
     * @return IlluminateDatabaseEloquentRelationsHasMany
     */
    public function participants()
    {
        return $this->belongsToMany('NamespaceModulesEmailModelsParticipant', 'participants', 'message_id', 'user_id')->withTimestamps();
    }

    /**
     * Recipients of this message
     *
     * @return IlluminateDatabaseEloquentRelationsHasMany
     */
    public function recipients()
    {
        return $this->participants()->where('user_id', '!=', $this->user_id);
    }

    /**
     * Returns the latest message from a thread
     *
     * @return NamespaceModulesEmailModelsMessage
     */
    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.*');
    }

}

участник

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 IlluminateDatabaseEloquentRelationsBelongsTo
     */
    public function message()
    {
        return $this->hasMany('NamespaceModulesEmailModelsMessage');
    }

    /**
     * User relationship
     *
     * @return IlluminateDatabaseEloquentRelationsBelongsTo
     */
    public function user()
    {
        return $this->belongsTo(Config::get('email.user_model'));
    }
}

2 ответов


ответил через официальный слабину Larachat:

связь отсутствует сводная таблица для этой работы. Второй аргумент в participants метод является сводной таблицей для использования:

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

таким образом, вы не можете использовать участников в качестве оси, потому что это одна из таблиц в отношениях, вам нужно message_participant сводная таблица.


ваша ошибка

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

вам нужно предоставить псевдонимы для каждой ссылки, как в

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

и затем использовать p1 и p2 в правильных местах, например

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

(Я предполагаю, на что p1 и что p2; вы должны сделать это определение)