你好,
为特定模型创建toSearchableArray
,如果最终数组中不包含ID
,则无法使用php artisan scout:import "App\Book"
导入数据。 但是如果我包含ID
,那么它也可以通过ID
进行搜索,这是我想逃避的行为。 通过ID
禁用搜索的正确方法是什么?
示例代码:
public function toSearchableArray()
{
$array = $this->toArray();
foreach(array_keys($array) as $key) {
//if I unset ID also, I won't be able to import table data
if(in_array($key, ['id', 'title', 'name'])) continue;
unset($array[$key]);
}
return $array;
}
嘿@milosevicn ,
->toSearchableArray()
定义了MeiliSearch 中特定文档(对象)的存储数据。 省略id
将导致搜索中的不可发现元素,因为默认情况下id
是用于标识文档的主键。
为了防止 MeiliSearch 搜索所有字段,请考虑扩展此包的功能并在 MeiliSearch 中设置searchAttributes
。 您可以在此处找到执行此操作的教程。
@mmachatschek抱歉打扰您,但我不想为此打开新问题。 这可能与我上面的问题有关。
当我使用php artisan scout:import
命令添加文档时,一切都按预期工作,但是当我使用/indexes/:index_uid/documents
路由( ->addDocuments()
)做同样的事情时,它不尊重toSearchableArray()
规则。 因此,如果我尝试添加整个模型,则会添加所有列。
我可能可以通过在查询时选择特定列来克服这个问题,但是有没有办法让函数addDocuments()
本身意识到toSearchableArray()
?
嗨@米洛舍维奇,
这个包基本上是 MeiliSearch PHP 库的包装器,并扩展了 Laravel Scout。
当“手动”添加文档时,Scout 提供的所有魔法(例如向索引添加新对象或更新具有特定字段的现有对象等)都将丢失,因为您跳过了这些步骤。
您是否有通过手动添加文档的特定意图?
感谢您回复@mmachatschek
我有多租户应用程序 - 两个独立的应用程序(房东和租户)。 因此,一旦将某些内容添加到数据库中,我就无法使用预定义的 Laravel Scout 功能来自动更新文档。 这就是为什么我使用 webhook 来通知我的租户应用程序时,当房东的数据库中实际发生某些事情时(在创建/更新/删除时)。 一旦我在租户上捕获了 webhook,我想添加这些文档
@milosevicn我想你可以做一个$model->touch()
。 这会更新模型的 updated_at 列,并且将在租户应用程序上触发updated
事件。 然后 Scout 事件侦听器将触发对索引的更新。 这对你有用吗?
最有用的评论
嘿@milosevicn ,
->toSearchableArray()
定义了MeiliSearch 中特定文档(对象)的存储数据。 省略id
将导致搜索中的不可发现元素,因为默认情况下id
是用于标识文档的主键。为了防止 MeiliSearch 搜索所有字段,请考虑扩展此包的功能并在 MeiliSearch 中设置
searchAttributes
。 您可以在此处找到执行此操作的教程。