【问题标题】:laravel5.1 retrieve not directly related attributes using eloquentlaravel5.1 使用 eloquent 检索不直接相关的属性
【发布时间】:2016-05-20 20:30:02
【问题描述】:

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

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 有一个附件(文件)。 现在我需要检索给定票证和票证_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 生成的查询无法按上述方式工作。如果有更简单的方法,请告诉我。 似乎 eloquent 无法获得票证和文件之间的关系。如何使用ticket_replie 告诉eloquent 有关系?

【问题讨论】:

    标签: php mysql eloquent laravel-5.1 relationship


    【解决方案1】:

    如果您已经知道ticket_replie_id,您所要做的就是:

    File::where('ticket_replie_id', $ticket_replie_id)->first();
    

    在更一般的情况下,您可以参考Eager Loading。

    【讨论】:

    • 我想检查一下,如果用户被“允许”下载这个文件(没有用户将能够“猜测”ids 并下载与他们无关的文件),这就是为什么我想用Auth::user()->tickets() 的方式。知道该怎么做吗?
    • 我会先识别文件,然后检查用户权限
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2018-09-28
    • 2019-10-14
    • 2011-12-29
    • 2017-02-08
    • 2021-01-10
    相关资源
    最近更新 更多