laravel / scout

Laravel Scout provides a driver based solution to searching your Eloquent models.
https://laravel.com/docs/scout
MIT License
1.54k stars 327 forks source link

Scout with Meilisearch, is sending all model data instead of just the specific data defined in the toSearchableArray() method. #823

Closed devravik closed 4 months ago

devravik commented 4 months ago

Scout Version

10.8.6

Scout Driver

Meilisearch

Laravel Version

10.0

PHP Version

8.2

Database Driver & Version

MySQL 8

SDK Version

No response

Meilisearch CLI Version

No response

Description

Scout, combined with Meilisearch, is sending all model data instead of just the specific data I've defined in the toSearchableArray() method.

Steps To Reproduce

artisan scout:import "App\ContactModel"

driesvints commented 4 months ago

Hey @devravik. I can't believe that's correct.. It's literally implemented in the update method:

https://github.com/laravel/scout/blob/10.x/src/Engines/MeilisearchEngine.php#L63

Are you sure that this is happening? How did you reach this conclusion?

devravik commented 4 months ago

Hey @driesvints,

Here following are further details

Ran php artisan scout:import "App\DeviceModel"

dd for toSearchableArray() returns following

array:18 [ "id" => 1 "name" => "1 5033T Black OC " "brand_name" => "Alcatel" "type" => null "img_url" => "/img/default.png" "service_fee" => null "boost_value" => 0 "listed" => 1 "brand" => array:5 [ "id" => 40 "name" => "Alcatel" "img_url" => "brands/T4wT4E2WBzfe8ZY4djf5S4s4DwWP4iVmTOfQ1znd.jpeg" "service_fee" => null "listed" => true ] "services_count" => 6 "can_trade_in" => 1 "can_upgrade" => 0 "can_repair" => 1 "moorup_sku" => "" "price_functional_not_broken_screen" => 10000 "price_functional_broken_screen" => 8000 "price_non_functional_not_broken_screen" => 5000 "price_non_functional_broken_screen" => 3000 ] // app/DeviceModel.php:52

Object I got from Meilisearch which isn't matches with above we are sending

 {
    "id": 1,
    "brand_id": 40,
    "img_url": "/img/default.png",
    "service_fee": null,
    "type": null,
    "is_listed": 1,
    "name": "1 5033T Black OC ",
    "can_trade_in": 1,
    "can_repair": 1,
    "can_upgrade": 0,
    "boost_value": 0,
    "moorup_sku": "",
    "sales_model_code": null,
    "price_functional_not_broken_screen": 10000,
    "price_non_functional_not_broken_screen": 5000,
    "price_functional_broken_screen": 8000,
    "price_non_functional_broken_screen": 3000,
    "created_at": "2020-05-20T14:12:39.000000Z",
    "updated_at": "2023-07-07T15:48:04.000000Z",
    "device_name": "Alcatel 1 5033T Black OC ",
    "brand_name": "Alcatel",
    "listed": true,
    "services_count": 6,
    "brand": {
      "id": 40,
      "name": "Alcatel",
      "img_url": "brands/T4wT4E2WBzfe8ZY4djf5S4s4DwWP4iVmTOfQ1znd.jpeg",
      "service_fee": null,
      "created_at": "2019-08-17T18:04:26.000000Z",
      "updated_at": "2020-08-27T04:17:50.000000Z",
      "listed": true
    }
  },

Which matches with $fillable and also included brand relation as loaded for object and appended attributes.

protected $fillable = [ 'name', 'brand_id', 'type', 'img_url', 'service_fee', 'is_listed', 'price_non_functional_broken_screen', 'price_functional_broken_screen', 'price_non_functional_not_broken_screen', 'price_functional_not_broken_screen', 'moorup_sku', 'can_upgrade', 'can_trade_in', 'sales_model_code', 'can_repair', ];