laravel5.1使用eloquent

时间:2016-02-09 20:35:14

标签: php mysql eloquent laravel-5.1 relationship

我目前不知道如何以聪明的方式完成这项工作。我想防止写出大量的查询。 首先我的桌子设计:

users:
|id|username|

tickets:
|id|user_id|

ticket_replies:
id|ticket_id|user_id|

files:
|id|ticket_replie_id|name

我的控制员:

user:
public function tickets()
{
    return $this->hasMany('App\ticket');
}

ticket:
public function ticket_replie() 
{
    return $this->hasMany('App\ticket_replie', 'ticket_id', 'id');
}

ticket_replie:
public function file() 
{
        return $this->hasOne('App\File', 'ticket_replie_id', 'id');
}

每个ticket_replie只能与一个附件(只有一个附件ticket_replie)相关,这就是我使用hasOne关系的原因。 现在我需要检索给定票证和文件的文件名称。 ticket_replie_id。 在我的控制器中,我现在使用它:

 $ticket = Auth::user()->tickets()->where('tickets.id', $id)->where('files.ticket_replie_id', $attachment_id)->firstOrFail();

Laravel为我生成了这个查询&错误:

select * from `tickets` where `tickets`.`user_id` = 1 and `tickets`.`user_id` is not null and `tickets`.`id` = 43 and `files`.`ticket_replie_id` = 39 limit 1

 Column not found: 1054 Unknown column 'files.ticket_replie_id' in 'where clause

查询必须类似于:

select * from `tickets`, `files` where `tickets`.`user_id` = 1 and `tickets`.`user_id` is not null and `tickets`.`id` = 43 and `files`.`ticket_replie_id` = 39 limit 1

当我在我的数据库中运行此查询时,它返回所需的信息。我的方式是否可以检索信息?哪里是我的错,因为目前Eloquent生成的查询没有按上述方式工作。如果有更简单的方法,请告诉我。

我知道eagerload,我试过这个:

$ticket = Auth::user()->tickets()->with(['file'=>function($f) use ($attachment_id) { $f->where('files.ticket_replie_id', $attachment_id); } ])->where('tickets.id', $id)->where('files.ticket_replie_id', $attachment_id)->firstOrFail();`. 

结果是:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'files.ticket_replie_id' in 'where clause' (SQL: select * from `tickets` where `tickets`.`user_id` = 1 and `tickets`.`user_id` is not null and `tickets`.`id` = 43 and `files`.`ticket_replie_id` = 39 limit 1) 

故障的原因是故障单和文件模型之间没有“关系”,或者我错了?

1 个答案:

答案 0 :(得分:1)

你必须加载你的关系,然后你可以应用where条件。看,这是一个例子。

$courses = Courses::with(['quizzes','chapters'=>function($q){
                        $q->where('status','1')->orderBy('orderby','ASC');
                    },'chapters.quizzes','chapters.lessons'=>function($q) use ($lessonid){
                        $q->where('status','1')->orderBy('orderby','ASC');
                    },'chapters.lessons.quizzes'])->where('status','1')->where('id',$courseid)->first();

with([])用于加载模型关系,例如:quizzes与测验表的关系,chapters=>function($q)....它也是一个关系,但我在章节关系等上应用条件

我希望这对你有意义