我试图过滤掉两个集合,这两个集合是从父集合中带回来的两个子集合。
$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>
答案 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());
}
}
}