Bạn có thể viết lại truy vấn của mình dưới dạng kết hợp trái để nhận được kết quả tương tự
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
và tôi đoán bạn có thể dễ dàng chuyển đổi truy vấn phía trên trong phạm vi của mình, chẳng hạn như
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 tất cả các hàng có max create_at
Laravel - Nhận mục nhập cuối cùng của mỗi loại UID
Nhóm Laravel Eloquent theo hồ sơ gần đây nhất
Chỉnh sửa bằng cách sử dụng truy vấn trên vì has
mối quan hệ, Để có được lịch sử mới nhất cho từng phần, bạn có thể xác định một hasOne
mối quan hệ như
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.*');
}
}
Và sau đó để tải các phần có lịch sử mới nhất của chúng, bạn có thể tải lên bản đồ được xác định ở trên là
$parts = Part::with('latest_history')->get();
Bạn sẽ có danh sách các phần cùng với lịch sử mới nhất là
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
)
)
....
)