Laravel - 语法错误或访问冲突:1066 不是唯一的表/别名

Posted

技术标签:

【中文标题】Laravel - 语法错误或访问冲突:1066 不是唯一的表/别名【英文标题】:Laravel - Syntax error or access violation: 1066 Not unique table/alias 【发布时间】:2018-12-07 23:18:03 【问题描述】:

我有一个用户模型

class User

    protected $primaryKey = 'user_id';

    public function blocks()
    
        return $this->belongsToMany(Block::class, 'block_user', 'blocker_id', 'blocked_id')->withTimestamps();
    

还有一个积木模型

class Block extends Model

    protected $table = "block_user";

所以我有两个表:一个用于用户信息,另一个用于当一个阻塞另一个时(数据透视表),所以用户表中的user_id 既是本地的又是外部的。

问题是,当我想知道用户是否阻止了另一个用户时,它会返回一条错误消息:Syntax error or access violation: 1066 Not unique table/alias: 'block_user'

$user = User::where('user_id', 1)->first();
dd($user->blocks->first_name);

我该如何解决?谢谢

【问题讨论】:

多对多关系需要一个数据透视表或中间表。 正如我所说我有数据透视表但是我只有两个表。其中一个用户其中一个枢轴。还需要另外一张桌子吗? 但我真的不需要更多了!这第三张表应该包含什么?!来自users 表的用户阻止来自users 表的另一个用户和一个包含哪个用户阻止了block_user 表中的哪个用户的数据透视表,所以我不需要另一个表。我会吗? 好的,我明白你的意思了。您不需要 Block 模型。此关系中的相关模型是用户。这是User -> blocks <- User。因为这是多对多的关系,所以你永远无法做到$user->blocks->first_nameblocks 将是一个集合。 但我没明白你的意思!我现在该怎么办?我应该将Block::class 更改为User::class 吗? 【参考方案1】:

您将 User 模型与 User 模型相关联,而不是与 Block 模型相关联。数据透视表的模型不是必需的,通常永远不会使用。

public function blocks()

    return $this->belongsToMany(User::class, 'block_user', 'blocker_id', 'blocked_id')->withTimestamps();

因此,不要与您的 belongsToMany 中的 Block::class 相关,而是与 User::class 相关。

【讨论】:

我刚做了,但$user->blocks() 没有为被阻止的用户返回任何值。 blocks()用于查询关系,使用属性blocks获取集合。 宾果游戏 :)) 非常感谢 :)

以上是关于Laravel - 语法错误或访问冲突:1066 不是唯一的表/别名的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 语法错误或访问冲突

Laravel:语法错误或访问冲突:1055 错误

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误

Laravel 迁移语法错误或访问冲突 1064