Cập nhật Laravel 5.8.27, tính năng mới khi làm việc với Polymorphic Relations

Laravel v5.8.27 release ngày 02/07/2019 với phương thức whereHasMorph() mới được thêm vào để làm việc với polymorphic Eloquent relations (quan hệ đa hình - MorphTo)

Phương thức whereHasMorph mới được sử dụng để query polymorphic relationships như sau:

Comment::whereHasMorph('commentable', [Post::class, Video::class], function ($query) {
    $query->where('title', 'foo');
})->get();

Đoạn code bên trên tương ứng với query như sau:

select * from "comments"
where (
  (
    "commentable_type" = 'App\Post' and exists (
      select * from "posts" where "comments"."commentable_id" = "posts"."id" and "title" = 'foo'
    )
  ) or (
    "commentable_type" = 'App\Video' and exists (
      select * from "videos" where "comments"."commentable_id" = "videos"."id" and "title" = 'foo'
    )
  )
)

Sử dụng đối số thứ 2 của closure để đơn giản hóa các truy vấn với các ràng buộc khác nhau:

Comment::whereHasMorph('commentable', [Post::class, Video::class], function ($query, $type) {
    if ($type === Post::class) {
        // $query->
    }

    if ($type === Video::class) {
        // $query->
    }
});

Cuối cùng bạn cũng có thể nhập vào một wildcard (kí tự đại diện) ở đối số thứ 2 của phương thức để query cho các types có trong database:

Comment::whereHasMorph('commentable', '*', function ($query) {
    $query->where('title', 'foo');
})->get();

Ngoài ra, ở Laravel 5.8.27 chúng ta có thể cấu hình Laravel mix asset URL bằng biến môi trường MIX_ASSET_URL.

Bạn cũng có thể sử dụng phương thức setDriver() của class RedisManager để thiết lập driver mặc định.

Dưới đây là tất cả những thay đổi của phiên bản Laravel v5.8.27:

Added

  • Let mix helper use app.mix_url config (#28952)
  • Added RedisManager::setDriver() method (#28985)
  • Added whereHasMorph() and corresponding methods to work with MorphTo relations (#28928)

Fixed

Changed

  • Prevented TestResponse::dump() and TestResponse::dumpHeaders() methods from ending execution of the script (#28960)
  • Allowed TestResponse::dump() and TestResponse::dumpHeaders() methods chaining (#28967)
  • Allowed to NotificationFake accept custom channels (#28969)
  • Replace contents of service manifest atomically (#28973)
  • Pass down the serverVersion database connection option to Doctrine DBAL connection (#28964, 1b55b28)
  • Replace self:: with static:: in the Relation::getMorphedModel() (#28974)
  • Set a message for SuspiciousOperationException (#29000)
  • Storing Mailgun Message-ID in the headers after sending (#28994)

GitHub: https://github.com/laravel/framework/releases/tag/v5.8.27