Laravel Eloquent 相当复杂的关系

Posted

技术标签:

【中文标题】Laravel Eloquent 相当复杂的关系【英文标题】:Laravel Eloquent rather complex relationship 【发布时间】:2020-01-12 14:40:30 【问题描述】:

我有两个表,用户和作业。用户拥有一份工作:

来自用户模型:

public function getJobs()
    return $this->belongsTo('App\Jobs','operative_id','id');


public function getIncompleteJobs()
    return $this->belongsTo('App\Jobs','operative_id','id')
    ->where('jobStatus_id', '=', 1);

这很好,但作业在名为“status_id”的字段中具有状态(已完成、待处理等),我想进一步细化 getJobs(),使其仅返回 status_id 等于 2 的那些。

可能是我太厚了!

从 cmets 编辑:

$op = App\User::where('client_id', $us->getCompany->id)
    ->where('operative', 1)
    ->orderby('name')
    ->where('active', 1)
    ->with('getIncompleteJobs')
    ->get();

【问题讨论】:

您应该能够将->where('status_id', '=', 2); 附加到您的->belongsTo();看看这是否有效。 ->where('jobStatus_id', '=', 1); 应该是status_id 另一件事; jobsgetJobs()getIncompleteJobs())表示会返回很多结果,但您只返回 1(belongsTo() 返回单个记录或null),并且您的模型名称App\Jobs 应该是单数 Job... 检查您的命名约定。 【参考方案1】:

您可以创建关系,然后他们以您想要的任何条件在另一种方法中调用它。

这样:

public function jobs()

    return $this->belongsTo('App\Jobs','operative_id','id');


public function completedJobs()

    return $this->jobs()->where('status_id', '=', 2);

【讨论】:

似乎关系总是为空。使用原始 sql 可能会更好,但 eloquent 更整洁。 不能在关系中使用->get(),否则调用->with('completedJobs')会返回错误。 (它需要 Builder 类,->get() 将其转换为 Collection @TimLewis 我一开始忘记添加->get(),但我后来编辑了它。不过还是谢谢你的提醒。 :) 抱歉,get 是我的错字。没有得到。 是的,如果您调用User::first()->completedJobs();(使用()),这将起作用,但会破坏用作属性(User::first()->completedJobs;)或急切加载(->with("completedJobs"))或附加条件 (User::first()->completedJobs()->where(...);)

以上是关于Laravel Eloquent 相当复杂的关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 相当于 QueryBuilder 查询

Laravel Eloquent - 相当于第一个()?

Laravel五大功能之Eloquent关系模式

Laravel五大功能之Eloquent关系模式

Laravel Eloquent:获取嵌套关系中的数据总和并将其添加为新属性

我将如何在 Laravel Eloquent 中编写这个 MySQL 查询?