Laravel - eloqüente tem, com, onde

Laravel - eloqüente tem, com, onde

Problema

tem, com e Onde tem às vezes pode ser confuso para desenvolvedores iniciantes. Vamos dar alguma perspectiva sobre o que cada um deles significa

Solução

com() é geralmente usado com carregamento ansioso, o que é uma maneira rápida de puxar modelos relacionados. Basicamente, significa que, junto com o modelo principal, o Laravel pré -carregará o (s) relacionamento (s) listado (s). Isso é benéfico quando você precisa carregar dados adicionais e deseja evitar fazer N+1 DB más práticas. Com carregamento ansioso, você executa apenas uma consulta adicional de banco de dados em vez de potencialmente centenas de consultas adicionais.

Exemplo:

Usuário> Hasmany> Organização
$ usuários = usuário :: com ('organizações')-> get ();
foreach ($ usuários como $ usuário)
$ usuários-> organizações; // postagens já estão carregadas e nenhuma consulta de banco

Tem

tem() é usado para filtrar o modelo de seleção com base no relacionamento selecionado. É basicamente um método onde as relações. Se você apenas usa tem ('organização'), Usando o mesmo exemplo de usuários e organizações, isso significaria que ele puxará todos os usuários que têm pelo menos uma organização em seu 'portfólio'.

Exemplo:

Usuário> Hasmany> Organização
$ usuários = usuário :: tem ('organizações')-> get ();
// apenas usuários que têm pelo menos uma organização em seu portfólio são
contido na coleção

Onde tem

Onde tem() é quase o mesmo que tem(). Apenas permite que você especifique filtros adicionais para que o modelo relacionado seja verificado.

Exemplo:

Usuário> Hasmany> Organização
$ users = user :: wherehas ('organizações', função ($ q)
$ q-> where ('criate_at', '> =', '2020-01-01 00:00:00');
)-> get ();
// Somente usuários que têm organizações criadas no início de 2020 são devolvidas