如果我完全错了,或者你有更好的解决方案,我洗耳恭听;-)
我正在开发的软件允许用户将文档添加到订单中,默认情况下,文档的状态为“可见”。如果用户决定删除一个文件,则附加第二个状态“已删除”,因此用户可以在14天内恢复该文件;之后,另一个状态为附加(“已删除”)。
文档及其各自的状态工作正常,我收到多个状态-根据请求-从最新的状态开始。所以我想,只自动连接那些具有适当状态的文档可能比较方便,因为只有一个文档,但不幸的是,Laravel不像我那样信服下面是我的代码:
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');
});
}
}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');
}
}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');
}
}如果我使用此关系更改订单模型
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错误。
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');
});
});
}首先要感谢大家!
发布于 2020-07-16 03:55:36
我为我的目的找到了一种解决办法,但我仍然对我的问题的答案非常感兴趣,因为就我的理解而言,为什么不能使用条件与模型相关……
为了解决这个问题,我不直接使用relation -> OrderDocument,而是通过一个访问器,在这个访问器中,我只返回那些具有适当状态的文档。
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;
}谢谢!
https://stackoverflow.com/questions/62852189
复制相似问题