[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Alef Silva
Criador Alef Silva 12/05/2024

 

public function store(Request $request)
{
    $data = $request->all();

    $review = Review::create([
        'start_date' => $data['start_date'],
        'end_date'   => $data['end_date']
    ]);

    foreach ($data['approvers'] as $approverData) {

        $approver = $review->approvers()->create([
            'manager_id' => $approverData['manager_id']
        ]);

        foreach ($approverData['collaborators'] as $collaboratorData) {

            $approver->collaborators()->create([
                'profile_id' => $collaboratorData['profile_id'],
                'group_id'   => $collaboratorData['group_id'],
                'keep'       => $collaboratorData['keep']
            ]);
        }
    }

    return response()->json(['Registros gravados com sucesso' => $review], 201);
}

Gostaria de saber se a implementação acima lida bem com situações onde pode ser enviado para uma API um JSON tendo uma Review com centenas de approvers e cada approver com centenas de collaborators

Existe algum perigo em inserções com grande carga de dados ocorrer um timeout ou até mesmo um problema de performance?

Se puder apresentar alguma melhoria, por gentileza deixe aqui

Manager Carlos Ferreira 12/05/2024

Olá, Alef!

Tudo bem?

 

Uma das maneiras produtivas de inserir, seria usando o método insert() invés do create()

 

Massss, o insert() é mais arriscasdo, porque simplesmente insere, não validar o fillable, pode até usar ele mas com bastante cuidado (valida os dados antes) - o insert() vc pode passar uma matrix de dados, que vai persistir ela toda de uma vez.

 

--

 

Esse insert dentro do loop não ficou legal, ou usa o insert(), ou usa o createMany() 

[https://laravel.com/docs/11.x/eloquent-relationships#the-create-method]

Carlos Ferreira
Criador Alef Silva 12/05/2024

Tentei usar o createMany() e mesmo assim ele faz vários INSERT INTO proporcionais ao número de objetos que eu coloco no JSON, ou seja, se eu tiver 10 managers, são executados 10 INSERT INTO, se eu tenho 20 managers, são executados 20 INSERT INTO e assim por diante, e eu quero evitar isso...

Para verificar a quantidade de queries que são executadas, eu utilizo o Laravel Telescope e abro os detalhes da solicitação POST e as consultas que foram executadas

Vou mostrar um pedaço do meu código:

 
$data = $request->all();
 
DB::beginTransaction();

            $review = Review::create([
                'start_date' => $data['start_date'],
                'end_date'   => $data['end_date']
            ]);

            $approversData = [];

            foreach ($data['approvers'] as $approverData) {
                $approversData[] = [
                    'manager_id' => $approverData['manager_id']
                ];
            }

            $review->approvers()->createMany($approversData);

DB::commit();
 

Envio do JSON via POST

{
    "start_date": "2024-04-01",
    "end_date": "2024-04-05",
    "approvers": [
        {
            "manager_id": 1,
            "collaborators": [
                {
                    "profile_id": 1,
                    "group_id": 1,
                    "keep": true
                },
                {
                    "profile_id": 1,
                    "group_id": 2,
                    "keep": true
                },
                {
                    "profile_id": 1,
                    "group_id": 3,
                    "keep": true
                },
                {
                    "profile_id": 2,
                    "group_id": 2,
                    "keep": true
                }
            ]
        },
        {
            "manager_id": 2,
            "collaborators": [
                {
                    "profile_id": 3,
                    "group_id": 1,
                    "keep": true
                },
                {
                    "profile_id": 3,
                    "group_id": 3,
                    "keep": true
                }
            ]
        }
    ]
}

Se o JSON houver centenas de manager_id havera muitas queries e vejo isso como um grande problema

 

 

Alef Silva
Manager Carlos Ferreira 12/05/2024

Usa o método insert() mesmo, só valida bem estes dados.

 

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!