首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >belongsToMany关系中最新结果的Laravel 7.x - relate模型

belongsToMany关系中最新结果的Laravel 7.x - relate模型
EN

Stack Overflow用户
提问于 2020-07-12 01:07:19
回答 1查看 191关注 0票数 0

如果我完全错了,或者你有更好的解决方案,我洗耳恭听;-)

我正在开发的软件允许用户将文档添加到订单中,默认情况下,文档的状态为“可见”。如果用户决定删除一个文件,则附加第二个状态“已删除”,因此用户可以在14天内恢复该文件;之后,另一个状态为附加(“已删除”)。

文档及其各自的状态工作正常,我收到多个状态-根据请求-从最新的状态开始。所以我想,只自动连接那些具有适当状态的文档可能比较方便,因为只有一个文档,但不幸的是,Laravel不像我那样信服下面是我的代码:

代码语言:javascript
复制
class Order extends Model 
{
    public function documents()
    {
        return $this->hasMany('App\OrderDocument')
                    ->with('status')
                    ->whereHas('status', function($query) {
                        $query->first()->where('document_status_name', 'visible');
                    });
    }
}
代码语言:javascript
复制
class OrderDocument extends Model
{
    public function order()
    {
        return $this->belongsTo('App\Order');
    }

    public function status()
    {
        return $this->belongsToMany('App\DocumentStatus', 'order_documents_status', 'order_documents_id', 'status_id')
                    ->withPivot('created_at', 'updated_at', 'user_id')
                    ->withTimestamps()
                    ->orderBy('updated_at', 'desc');
    }
}
代码语言:javascript
复制
class DocumentStatus extends Model
{
    public function orderDocument()
    {
        return $this->belongsToMany('App\OrderDocument', 'order_documents_status', 'status_id', 'order_documents_id')
                    ->withPivot('user_id', 'created_at', 'updated_at')
                    ->orderBy('updated_at', 'desc');
    }
}

如果我使用此关系更改订单模型

代码语言:javascript
复制
public function documents()
{
    return $this->hasMany('App\OrderDocument');
}

一切都运行得很顺利,我收到了我的订单和它的文档,每个文档都可以有created_at desc排序的许多状态,但只要我添加whereHas条件,我就会得到以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'order_documents.id' in 'where clause' (SQL: select * from document_status inner join order_documents_status on document_status.document_status_id = order_documents_status.status_id where order_documents.id = order_documents_status.order_documents_id limit 1)

当然找不到order_documents.id,表没有连接,但我甚至不能想象为什么这个表一开始就加载到那里?

有没有人对如何只查询多对多关系的最新元素有什么建议?我考虑在OrderDocument上使用globalScope,因为这样更容易“禁用”限制,以防我真的想让所有文档忽略它们的状态,但我也无法让它工作,有趣的是,使用相同的OrderDocument错误。

代码语言:javascript
复制
protected static function booted()
{
    static::addGlobalScope('visible', function (\Illuminate\Database\Eloquent\Builder $builder) {
        $builder->whereHas('status', function($query) {
            $query->first()->where('document_status_name', 'visible');
        });
    });
}

首先要感谢大家!

EN

回答 1

Stack Overflow用户

发布于 2020-07-16 03:55:36

我为我的目的找到了一种解决办法,但我仍然对我的问题的答案非常感兴趣,因为就我的理解而言,为什么不能使用条件与模型相关……

为了解决这个问题,我不直接使用relation -> OrderDocument,而是通过一个访问器,在这个访问器中,我只返回那些具有适当状态的文档。

代码语言:javascript
复制
public function getDocumentsDetailAttribute()
{
    $documents = [];
    $this->documents->each(function($document) use (&$documents) {
        if(!in_array($document->status->first()->document_status_name, ['visible'])) {
            return;
        }

        $documents[] = [
            'id' => $document->id,
            'name' => $document->name,
            'link' => route('orderdocument.download', ['orderDocument' => $document->id]),
            'created_at' => $document->created_at,
            'status' => $document->status->first()->document_status_name,
       ];
    });

    return $documents;
}

谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62852189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档