समान परिणाम प्राप्त करने के लिए आप अपनी क्वेरी को लेफ्ट जॉइन के रूप में फिर से लिख सकते हैं
select a.*
from part_histories a
left join part_histories b on a.part_id = b.part_id
and a.created_at < b.created_at
where b.part_id is null
और मुझे लगता है कि आप आसानी से उपरोक्त क्वेरी को अपने दायरे में कुछ इस तरह बदल सकते हैं
public function scopeWithLatestStatus($query)
{
return $query->leftJoin('part_histories as b', function ($join) {
$join->on('a.part_id', '=', 'b.part_id')
->where('a.created_at', '<', 'b.created_at');
})
->whereNull('b.part_id')
->from('part_histories as a')
->select('a.*');
}
Laravel Eloquent select अधिकतम create_at वाली सभी पंक्तियाँ
लारावेल - प्राप्त करें प्रत्येक UID प्रकार की अंतिम प्रविष्टि
लारवेल एलोक्वेंट ग्रुप नवीनतम रिकॉर्ड के अनुसार
उपरोक्त क्वेरी का उपयोग करके संपादित करें क्योंकि has
संबंध, प्रत्येक भाग के लिए नवीनतम इतिहास प्राप्त करने के लिए आप एक hasOne
define को परिभाषित कर सकते हैं संबंध जैसे
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Part extends Model
{
public function latest_history()
{
return $this->hasOne(\App\Models\PartHistory::class, 'part_id')
->leftJoin('part_histories as p1', function ($join) {
$join->on('part_histories.part_id', '=', 'p1.part_id')
->whereRaw(DB::raw('part_histories.created_at < p1.created_at'));
})->whereNull('p1.part_id')
->select('part_histories.*');
}
}
और फिर उनके नवीनतम इतिहास के साथ भागों को लोड करने के लिए आप
. के रूप में परिभाषित मानचित्रण के ऊपर लोड करने के लिए उत्सुक हो सकते हैं$parts = Part::with('latest_history')->get();
आपके पास नवीनतम इतिहास के साथ-साथ भागों की एक सूची होगी
Array
(
[0] => Array
(
[id] => 1
[title] => P1
[latest_history] => Array
(
[id] => 6
[created_at] => 2018-06-16 08:25:10
[status] => 1
[part_id] => 1
)
)
....
)