Olá,
Ao criar toSearchableArray
para um modelo específico, se não houver ID
incluído no array final, não posso importar os dados usando php artisan scout:import "App\Book"
. Mas se eu incluir ID
, então ele se tornará disponível para pesquisa por ID
também, que é o comportamento que eu gostaria de escapar. Qual é a maneira correta de desativar a pesquisa por ID
?
Código de exemplo:
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;
}
Ei @milosevicn ,
o ->toSearchableArray()
define os dados armazenados no MeiliSearch para um documento específico (objeto). A omissão de id
resultará em elementos não detectáveis na pesquisa porque, por padrão, id
é a chave primária usada para identificar um documento.
Para evitar que o MeiliSearch pesquise em todos os campos, considere estender a funcionalidade deste pacote e definir searchAttributes
no MeiliSearch. Você pode encontrar um tutorial para fazer isso aqui .
@mmachatschek Desculpe incomodá-lo, mas eu não queria abrir um novo problema para isso. Pode estar relacionado à minha pergunta lá em cima.
Quando estou adicionando documentos usando o comando php artisan scout:import
, tudo funciona como deveria, mas quando estou fazendo o mesmo usando /indexes/:index_uid/documents
route ( ->addDocuments()
) isso não respeita toSearchableArray()
regras. Portanto, se eu tentar adicionar o modelo inteiro, todas as colunas serão adicionadas.
Eu provavelmente seria capaz de superar isso selecionando colunas específicas ao fazer a consulta, mas existe uma maneira de fazer a função addDocuments()
reconhecer toSearchableArray()
?
Olá @milosevicn ,
este pacote é basicamente um wrapper para a biblioteca MeiliSearch PHP e estende o Laravel Scout.
Ao adicionar documentos "manualmente", toda a mágica que o Scout oferece, por exemplo, adicionar novos objetos ao índice ou atualizar os existentes com campos específicos, etc., se perde porque você pula essas etapas.
Você tem uma intenção específica ao adicionar documentos manualmente?
Obrigado por responder @mmachatschek
Eu tenho um aplicativo multilocação - dois aplicativos separados (senhorio e inquilino). Por causa disso, não posso usar a funcionalidade predefinida do Laravel Scout para atualizar documentos automaticamente, uma vez que algo é adicionado ao banco de dados. É por isso que estou usando um webhook para informar meu aplicativo de locatário quando algo realmente aconteceu no banco de dados do proprietário (em criado / atualizado / excluído). Quero adicionar esses documentos assim que pegar um webhook no locatário
@milosevicn Acho que você poderia simplesmente fazer um $model->touch()
. Isso atualiza a coluna updated_at do modelo e o evento updated
será acionado no aplicativo locatário. O ouvinte de evento do Scout acionará uma atualização no índice. Isso funcionaria para você?
Comentários muito úteis
Ei @milosevicn ,
o
->toSearchableArray()
define os dados armazenados no MeiliSearch para um documento específico (objeto). A omissão deid
resultará em elementos não detectáveis na pesquisa porque, por padrão,id
é a chave primária usada para identificar um documento.Para evitar que o MeiliSearch pesquise em todos os campos, considere estender a funcionalidade deste pacote e definir
searchAttributes
no MeiliSearch. Você pode encontrar um tutorial para fazer isso aqui .