Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel Live Vietnam 2022: Laravel Eloquent Performance

Laravel Live Vietnam 2022: Laravel Eloquent Performance

Dinh Quoc Han

March 25, 2023
Tweet

More Decks by Dinh Quoc Han

Other Decks in Technology

Transcript

  1. Laravel Vietnam
    Laravel Eloquent
    Performance
    "You can improve your Laravel app faster!"

    View Slide

  2. Laravel Vietnam
    Who?
    ● My name is Dinh Quoc Han / Đinh Quốc Hân
    ● I'm a PHP Lover, Laravel fan!
    ● 7 years experience in software development
    ● Currently working at SHIFT ASIA
    ● Admin at Laravel Vietnam

    View Slide

  3. Laravel Vietnam
    TL;DR
    This is a long talk 😅

    View Slide

  4. Laravel Vietnam
    What is Eloquent?

    View Slide

  5. Laravel Vietnam

    View Slide

  6. Laravel Vietnam
    Laravel Eloquent is Model
    Eloquent is an object relational mapper (ORM) that is included by
    default within the Laravel framework.

    View Slide

  7. Laravel Vietnam
    Notice!
    This talk is not re-explain
    database, migrations, and models.

    View Slide

  8. Laravel Vietnam
    Let's start with recommended tool.

    View Slide

  9. Laravel Vietnam
    Laravel Debugbar
    By Barry vd. Heuvel

    View Slide

  10. Laravel Vietnam
    https://github.com/barryvdh/laravel-debugbar

    View Slide

  11. Laravel Vietnam

    View Slide

  12. Laravel Vietnam
    No. 1
    Indexing your necessary columns

    View Slide

  13. Laravel Vietnam
    Seeding 10,000 users.

    View Slide

  14. Laravel Vietnam

    View Slide

  15. Laravel Vietnam

    View Slide

  16. Laravel Vietnam

    View Slide

  17. Laravel Vietnam

    View Slide

  18. Laravel Vietnam

    View Slide

  19. Laravel Vietnam

    View Slide

  20. Laravel Vietnam
    No.2
    Lazy Loading & Issue N+1

    View Slide

  21. Laravel Vietnam

    View Slide

  22. Laravel Vietnam

    View Slide

  23. Laravel Vietnam
    Seeding 100 posts

    View Slide

  24. Laravel Vietnam

    View Slide

  25. Laravel Vietnam

    View Slide

  26. Laravel Vietnam

    View Slide

  27. Laravel Vietnam

    View Slide

  28. Laravel Vietnam

    View Slide

  29. Laravel Vietnam

    View Slide

  30. Laravel Vietnam

    View Slide

  31. Laravel Vietnam
    load () & loadMissing()

    View Slide

  32. Laravel Vietnam
    load() & loadMissing() only call on Model or Eloquent Collection.

    View Slide

  33. Laravel Vietnam
    How to prevent lazy loading?

    View Slide

  34. Laravel Vietnam

    View Slide

  35. Laravel Vietnam

    View Slide

  36. Laravel Vietnam
    No. 3
    Prefer using sub-query for
    dynamic property

    View Slide

  37. Laravel Vietnam
    Requirement
    Add the `Last Published At` to the Users table.

    View Slide

  38. Laravel Vietnam

    View Slide

  39. Laravel Vietnam

    View Slide

  40. Laravel Vietnam

    View Slide

  41. Laravel Vietnam

    View Slide

  42. Laravel Vietnam

    View Slide

  43. Laravel Vietnam

    View Slide

  44. Laravel Vietnam

    View Slide

  45. Laravel Vietnam
    Requirement
    Sorting with `last_published_at` column?

    View Slide

  46. Laravel Vietnam

    View Slide

  47. Laravel Vietnam
    No. 4
    Using "raw" to decrease query
    statements

    View Slide

  48. Laravel Vietnam
    Requirement
    Show 3 blocks:
    1. Total posts
    2. Total published posts
    3. Total draft posts

    View Slide

  49. Laravel Vietnam

    View Slide

  50. Laravel Vietnam

    View Slide

  51. Laravel Vietnam
    Requirement
    Order by "published post -> drafted post" with
    "created_at" 😅

    View Slide

  52. Laravel Vietnam

    View Slide

  53. Laravel Vietnam
    No. 5
    Using "setRelation" to decrease
    duplicated query statements

    View Slide

  54. Laravel Vietnam
    Example
    We have a comments list shown in the post.
    Comment::class has an accessor `url`, it will be the
    link of the comment (The post URL with comment
    fragment).
    So, it will be a duplicate query statement if shown on
    the post detail page. Let me show you.

    View Slide

  55. Laravel Vietnam

    View Slide

  56. Laravel Vietnam

    View Slide

  57. Laravel Vietnam

    View Slide

  58. Laravel Vietnam
    Duplicated SQL Statements
    ● The post detail
    ● The post in the comment eager loader
    👉 It took 2 statements but is the same.

    View Slide

  59. Laravel Vietnam
    Introduce 👀
    Model::setRelate()

    View Slide

  60. Laravel Vietnam

    View Slide

  61. Laravel Vietnam
    Bonus

    View Slide

  62. Laravel Vietnam
    Eloquent Scope

    View Slide

  63. Laravel Vietnam

    View Slide

  64. Laravel Vietnam
    Eloquent Custom Query Builder

    View Slide

  65. Laravel Vietnam
    When?
    If you have a lot of scope methods in the model and you won't find a
    way to extract this into the new class. This is exactly the way you want.

    View Slide

  66. Laravel Vietnam

    View Slide

  67. Laravel Vietnam
    Eloquent Accessor/Mutator

    View Slide

  68. Laravel Vietnam
    The old ways:
    "getFieldNameAttribute"
    "setFieldNameAttribute"
    Both do not mention in the new
    version 😅

    View Slide

  69. Laravel Vietnam

    View Slide

  70. Laravel Vietnam

    View Slide

  71. Laravel Vietnam

    View Slide

  72. Laravel Vietnam
    Interacts with attributes

    View Slide

  73. Laravel Vietnam

    View Slide

  74. Laravel Vietnam
    Illuminate\Database\Eloquent\Concerns\HasAttributes

    View Slide

  75. Laravel Vietnam
    Eloquent Guard Fields

    View Slide

  76. Laravel Vietnam

    View Slide

  77. Laravel Vietnam
    Do not do it! Security Issue!

    View Slide

  78. Laravel Vietnam
    Illuminate\Database\Eloquent\Concerns\GuardsAttributes

    View Slide

  79. Laravel Vietnam
    Relation property is difference
    relation method 😅

    View Slide

  80. Laravel Vietnam

    View Slide

  81. Laravel Vietnam
    Eloquent Custom Collection

    View Slide

  82. Laravel Vietnam
    When?
    If you have a lot of logic collection methods with the model. E.g: The
    positive price invoice lines. You don't need to rewrite logic in many
    places.

    View Slide

  83. Laravel Vietnam

    View Slide

  84. Laravel Vietnam

    View Slide

  85. Laravel Vietnam
    How to add new relation without
    edit the model 😎

    View Slide

  86. Laravel Vietnam

    View Slide

  87. Laravel Vietnam
    Lots of interesting things…
    I can't talk all of them 😅

    View Slide

  88. Laravel Vietnam
    View Eloquent ORM
    In: laravel.com/docs

    View Slide

  89. Laravel Vietnam
    Thank You
    Q&A

    View Slide