使用枢轴模型找不到Laravel基表

时间:2014-03-15 02:13:43

标签: php mysql laravel eloquent

您好我试图查询我的任务表。关于表格的一些背景信息以及它们如何相关。

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

默认情况下,我想查找status_namestatuses does not中关注的equal所有用户的任务。我决定最好实际创建一个名为task_status的表,其中包含task_idstatus_id。我仍然希望找到登录用户任务,然后根据任务表中保存的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

我的模特:

Task.php

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

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

Status.php

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

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

TaskStatus.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, ))

我确信我的关系定义不正确,但我不确定如何纠正这些问题。任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您也可以尝试以下代码:

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

查看querying relationships上的雄辩文档。

还要记住不要回顾return视图。

答案 1 :(得分:0)

错误似乎与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');
} 

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