链接2相关集合在一起

时间:2018-04-10 16:57:42

标签: php laravel

我试图过滤掉两个集合,这两个集合是从父集合中带回来的两个子集合。

$producers = Producer::with( [
        'intakes' => function ( $query ) use ( $dates ) {
            $query->whereIn( 'collection_date', $dates )->orderBy('collection_date', 'asc')->get();
        }
    ], [
        'nmls' => function ( $query ) use ( $dates ) {
            $query->whereIn( 'sample_date', $dates )->orderBy('sample_date', 'asc')->get();
        }
    ] )->get()->find(1);

我收到的生产商集合并未按日期排序,因此我尝试在刀片文件中执行以下操作:

@foreach ($pro->intakes as $intake)
        @foreach ($pro->nmls as $nml)
            @if($intake->collection_date === $nml->sample_date)
                @include('milk.row', compact('pro', 'intake', 'nml'))
                @break
            @else
                @include('milk.row', compact('pro', 'intake', 'nml'))
                @break
            @endif
        @endforeach
@endforeach

但是它不起作用,我要么在没有Intakes的情况下获得NML数据,要么我使用重复的NML获得Intakes,反之亦然。

我不知道是否有办法将两个儿童收藏品连接在一起,以提取一个属于生产者的主要收藏品?

e.g

          * Producer
   nml  /   \ intake
        join
        \   /
          * Sample

我完全输了,我有一个方法,我在NML和Intake中找到max(),然后取出最大的数字然后循环遍历孩子,但它不能用于我认为会有更大的数据块。

非常感谢帮助。

感谢。

@edit

这就是我在刀片文件上检索数据的方法:

<tr action="{{route('milk.data.updateData')}}" class="updateData">
<th scope="row"><a href="{{route('producer.show', $pro->id)}}"
                   data-tooltip="View producer">{{$pro->producer_number}} <i
                class="fas fa-link"></i></a></th>
<td>{{$pro->producer_business_name}}</td>
@if(!empty($nml->sample_date))
    N <td>{{ \Carbon\Carbon::parse($nml->sample_date)->format('d/m/Y') }}</td>
@else
    I <td>{{ \Carbon\Carbon::parse($intake->collection_date)->format('d/m/Y') }}</td>
@endif
<input type="hidden" name="nid" value="{{!empty($nml->id) ? $nml->id : '' }}">
<input type="hidden" name="iid" value="{{!empty($intake->id) ? $intake->id :''}}">
...
...
...
...
</tr>

2 个答案:

答案 0 :(得分:1)

您基本上可以按日期分组 nmls 摄取数据,并循环显示所有日期以查看是否有 nmls 摄入量存在。

有很多helper functions可以提供帮助,例如keyBy

// following relations is group by date
// eg: [ 'date' => [ { intake }, { intake } ... ], ... ]
$intakes = $pro->intakes->keyBy('collection_date');
$nmls = $pro->nmls->keyBy('sample_date');

// get list of dates and sorted
$intake_dates = $intakes->keys();
$nml_dates = $nmls->keys();
$dates = $intake_dates->merge($nml_dates)->unique()->sort()->values();

// then you can loop through all the date
// and transform the data in controller and present in the view
foreach ($dates as $date) {
    if (isset($intakes[$date])) {
        ...
    }
    if (isset($nmls[$date])) {
        ...
    }
}

答案 1 :(得分:0)

感谢Ben的投入。最后,这是我解决它的方式。

所以,基本上我循环遍历每个Collection的副本,如果1个集合中的日期与2个日期匹配,并且两个集合中的外键相同,那么我将对象推送到全新的集合,其中2个先前的集合被合并。之后,我从两个集合中删除了两个项目。

这可能不是最好的方法,但是使用 Bens 方法会返回很多重复的内容(我试图避免这种情况)但是,他的回答对我来说非常有价值。

最诚挚的问候。

$milk_data = collect();

foreach($dup_intake as $keyI => $intake) {
        foreach($dup_nmls as $keyN => $nml) {
            if($intake->collection_date == $nml->sample_date && $intake->producer_id == $nml->producer_id) {
                $na = $nml->toArray();
                $ia = $intake->toArray();
                $collection = array_merge($na, $ia);
                $milk_data->push($collection);
                $dup_nmls->forget($keyN);
                $dup_intake->forget($keyI);
            } else if($milk_data->contains($nml) || !$milk_data->contains($intake) && $intake->producer_id == $nml->producer_id) {
                $milk_data->push($intake->toArray());
            } else if($milk_data->contains($intake) || !$milk_data->contains($nml) && $intake->producer_id == $nml->producer_id ) {
                $milk_data->push($nml->toArray());
            }
        }
    }