Laravel - 过滤morphOne或hasOne关系

时间:2018-04-02 19:37:36

标签: laravel laravel-5 laravel-5.5 laravel-5.6

我有三个与library(tidyverse) df %>% group_by(Num) %>% # create a temporary column PassFail1 mutate(PassFail1 = case_when( all(PassFail == "PASS") ~ "PASS", PassFail == "FAIL#NODATA" ~ "FAIL#NODATA", any(grepl("FAIL", PassFail)) ~ "FAIL")) %>% # remove the rows that have PASS mixed with FAIL in the same Num group filter(!(PassFail == "PASS" & PassFail1 == "FAIL")) %>% # remove duplicates distinct(PassFail1, .keep_all = TRUE) %>% # clean up select(-PassFail1) %>% ungroup() #> # A tibble: 6 x 5 #> ID Type PassFail Slot Num #> <fct> <fct> <fct> <dbl> <dbl> #> 1 ID001 Length PASS 1.00 1111. #> 2 ID001 Length PASS 1.00 1112. #> 3 ID003 Length FAIL 2.00 1113. #> 4 ID009 LengthTest FAIL 1.10 1114. #> 5 ID023 LengthTest FAIL#NODATA 2.20 1115. #> 6 ID027 LengthTest FAIL 3.10 1115. 关系相关的模型。

morph可以通过Shipment类有多个Status个实例。

StatusHistory

我想获取 class Status extends Model { //id, name } class Shipment extends Model { public function latestStatus() { return $this->morphOne('App\StatusHistory', 'model')->latest(); } } class StatusHistory extends Model { public function model() { return $this->morphTo(); } public function status() { return $this->belongsTo('App\Status', 'status_id'); } } 具有特定Shipment名称值的所有latestStatus个实体。

Status

这不起作用,并返回状态为&#39;保留&#39;的所有实体,即使 Shipment::whereHas('latestStatus', function($query) { return $query->whereHas('status', function($query) { return $query->where('name', 'reserved'); }); })->get(); 可能是其他内容。

有什么想法?

编辑(添加样本信息):

我有2批货。

  1. 第一个只有一个状态历史记录实例&#39; reserved&#39;在其状态名称。
  2. 第二个有两个状态历史记录实例&#39;保留&#39; &#39;发货&#39;在其状态名称中。发货的状态历史记录实例&#39;创建时间超过&#39; reserver&#39;。
  3. 所以:

    1. 第一批货物的最后状态为&#39; reserved&#39;。
    2. 第二批货物的最后状态为&#39;已发货&#39;。
    3. 电话应该只返回第一批货。

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是获取所有货件并在之后过滤它们:

Shipment::with('latestStatus.status')->get()->where('latestStatus.status.name', 'reserved')

根据您的数据库大小,这可能效率不高。

仅提取相关货件的查询:

Shipment::select('shipments.*')
    ->join('status_histories as sh', 'shipments.id', 'sh.model_id')
    ->join('statuses as st', 'sh.status_id', 'st.id')
    ->where('model_type', Shipment::class)
    ->where('st.name', 'reserved')
    ->where('created_at', function($query) {
        $query->selectRaw('MAX(created_at)')
            ->from('status_histories')
            ->where('model_id', DB::raw('sh.model_id'))
            ->where('model_type', DB::raw('sh.model_type'));
    })->get();