debugging 为什么在尝试返回基于用户ID的集合模型时出现“找不到列”错误?

ecbunoof  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(111)

我正在尝试返回给定用户参与的所有主题。
终结点接受一个userId,并假定返回一个线程模型集合。
然而,在执行控制器操作时,我一直收到这个错误。它正在寻找一个message_id列,但我没有在thread表或任何表上定义它--这是一个奇怪的错误。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'thread.message_id' in 'where 
clause' (SQL: select * from `thread` where `thread`.`message_id` = 2 and 
`thread`.`message_id` is not null)"

我相信我链接表的方式可能有问题,但我不完全确定。我假设message表的thread_id列应该引用thread表的id列,这就是我在下面的message迁移中所做的。
我做错了什么?我该如何解决?
以下是用户迁移:

Schema::create('users', function (Blueprint $table) {
        $table->id('id');
        $table->string('email')->unique();
        $table->string('full_name');
        $table->string('password');
});

以下是线程迁移:

Schema::create('thread', function (Blueprint $table) {
        $table->id();
        $table->string('title');
});

以下是邮件迁移:

Schema::create('message', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('user_id');
        $table->unsignedBigInteger('thread_id');
        $table->string('body');
        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        $table->foreign('thread_id')
            ->references('id')
            ->on('thread')
            ->onDelete('cascade');
});

控制器操作:

public function getUserThreads($userId) {
    $userParticipatedThreads = Message::findOrFail($userId);
    return $userParticipatedThreads->thread;
}

消息模型:

public function thread() {
    return $this->hasMany(Thread::class);
}

端点:

[GET] http://127.0.0.1:8000/api/getUserThreads/2

Route::get('getUserThreads/{userId}', [ThreadController::class, 'getUserThreads']);
siotufzp

siotufzp1#

Message类上的thread关系正在查找message_id,因为这是hasMany关系的默认工作方式。

public function thread() {
    return $this->hasMany(Thread::class, 'id', 'thread_id');
}

但是,由于看起来该消息属于一个线程(每个消息都有一个thread_id),因此实际上需要的是belongsTo

public function thread() {
    return $this->belongsTo(Thread::class);
}
r7xajy2e

r7xajy2e2#

回答问题;
为什么在尝试返回基于用户ID的集合模型时出现“找不到列”错误?
因为您的thread表没有定义message_id字段。

Schema::create('thread', function (Blueprint $table) {
        $table->id();
        $table->string('title');
});

一个Message属于一个Thread,但是你似乎把这种关系颠倒了。
Thread模型上,定义与Message模型的关系:

public function messages()
{
    return $this->hasMany(Message::class);
}

然后,您可以按用户查询某些消息的存在性:

$messages = Thread::whereHas('messages', function ($query) use ($userId) {
    $query->where('user_id', $userId);
})->get();

相关问题