【问题标题】:Laravel base table not found using pivot model使用数据透视模型找不到 Laravel 基表
【发布时间】:2014-04-20 13:17:24
【问题描述】:

您好,我正在尝试查询我的任务表。一些关于表格的背景信息以及它们之间的关系。

用户,创建项目和任务,项目和任务的状态可以从状态表中选择,用户自己创建,我计划有默认的,但用户可能想要创建自己的。

默认情况下,我想查找 statusesdoes not equal 中的 status_name 关闭的所有用户任务。我决定最好实际创建一个名为task_status 的表,其中包含task_idstatus_id。我还是想找到登录用户的任务,然后根据tasks表中保存的status_id找到状态名称,可以在statuses表中引用。然后我只想显示不等于 closed 的任何记录,但下面解释的第一部分比最初预期的要复杂。

我的表结构如下:

表结构

用户

id | username | email

任务

id | user_id | client_id | project_id | status_id | task_name | task_brief

状态

id | status_name 

项目

id | user_id | client_id | status_id | type_id | project_name | project_brief 

task_status

id | user_id | task_id | status_id 

我试图首先简单地查询我的数据库,以便我可以确定返回的数据是正确的。因此,我将查询更改为以下内容:

$user = User::with(array('tasks', 'task.status', 'tasks.taskstatus',
        'tasks.clients'))->find(Auth::user()->id);  

我正在尝试返回如下(请记住,我还想查询状态表,以便能够返回状态名称):

@foreach($user->tasks as $task) 
{{ $task->task_name }} 
    @if(!is_null($task->clients)) 
        {{ $task->clients->client_code }}
        @endif
        @if(!is_null($task->taskstatus)) 
            {{ $task->taskstatus->status_name }}
        @endif
@endforeach

我的模型:

任务.php

public function status(){
    return $this->hasOne('Status', 'status_id');
} 

public function taskstatus() {
    return $this->hasMany('TaskStatus', 'status_id');
} 

状态.php

public function tasks() 
{
    return $this->hasMany('Task');
}   

public function taskstatus()
    {
        return $this->hasMany('TaskStatus', 'status_id');
    }   

任务状态.php

public function tasks() 
{
    return $this->hasMany('Task', 'task_id');
}   

public function status() {
    return $this->belongsTo('Status', 'status_id')
}

但是使用上述返回以下错误:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 
'imanage.task_statuses' doesn't exist (SQL: select * from `task_statuses` 
 where `task_statuses`.`status_id` in (?, ?, ?, ?, ?, ?, ?)) 
(Bindings: array ( 0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6, 6 => 7, ))

我确定是我的关系定义不正确,但我不知道如何更正这些。有人可以帮忙吗?

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    你也可以试试这个代码:

    $user = User::whereHas('task.status', function($q)
                {
                  $q->where('status', '!=', 'close');
                })
                ->with('task', 'task.clients')
                ->where('id', Auth::user()->id)
                ->first();
    

    querying relationships 上查看雄辩的文档。

    还记得 DO NOT ECHO VIEW,改为return 视图。

    【讨论】:

    • 我收到此错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'has' in 'where clause' (SQL: select * from users` 其中has = ?和id = ?限制 1) (Bindings: array ( 0 => 'task.status', 1 => 1, ))` 它仍在尝试查询用户表的状态名称。有什么想法吗?
    • 哎呀。我认为 whereHas 应该先来。更新了我的答案。
    • 同样的错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'has' in 'where clause' (SQL: select * from users` 其中has = ?和id = ?限制 1) (绑定:数组 (0 => 'task.status', 1 => 1, ))`
    • 尝试将whereHas 更改为has。喜欢User::has(...
    • 更新了我的答案。改成。 ->where('id', Auth::user()->id)。不要使用find() 进行关系查询。
    【解决方案2】:

    该错误似乎与 Laravel(实际上是 Eloquent)获取错误的表名有关:下面是 task_statuses 而不是 task_status。请记住,Eloquent 会尝试复数命名模型来获取表名。

    SQLSTATE[42S02]: Base table or view not found: 1146 Table 
    'imanage.task_statuses' doesn't exist
    

    所以要么重命名你的表以匹配 Laravel 的期望,要么在你的模型中指定一个custom table name

    class TaskStatus extends Eloquent {
    
        protected $table = 'task_status';
    
        ...
    

    此外,我不清楚您的这部分代码:

    Task.php
    
    public function status(){
        return $this->hasOne('Status', 'status_id');
    } 
    
    public function taskstatus() {
        return $this->hasMany('TaskStatus', 'status_id');
    } 
    

    您的任务是有一个状态,还是有许多状态?

    【讨论】:

    • 如果我做这两个中的任何一个,我都会收到以下错误:Call to undefined method Illuminate\Database\Query\Builder::task()
    • 你的模型不扩展\Eloquent吗?你在用户中有tasks() 方法吗? - 等待。 task(),你说? task() 的单数形式在哪里?
    • 是的,它扩展了 eloquent,任务只能有一个状态,当我得到任务名称@foreach($user->tasks as $task) {{ $task->task_name }}时,我以单数形式调用任务
    • $user->tasks() 使用 plural 调用。那么$task 是一个对象(或者可能为空)。但是你不会得到关于task() 的错误,如果你调用tasks() 这完全是一个不同的函数。你能发布实际代码吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多