CodeIgniter Datamapper – Selecionando objetos que não tenham determinados relacionamentos

Faz tempo que trabalho com Code Igniter e gosto muito do Datamapper (leia mais sobre este ORM aqui). Hoje surgiu uma necessidade nova em um projeto e achei interessante o suficiente para compartilhar aqui. Em uma relação many to manycomo selecionar objetos que não tenham um relacionamento específico?

Por exemplo, tenho os models product e category, com relacionamento de muitos para muitos nos dois casos (um produto pode ter várias categorias e uma categoria pode ter vários produtos).

Como selecionar produtos que não estejam na categoria canecas, por exemplo?

A resposta curta é: subqueries.

// query para pegar todos os produtos que tem categoria "canecas"
$sub_products = new Product();
$sub_products->select('id')->where_related_category('name', 'canecas');
// Agora usando subqueries, pega todos que não estão na categoria
$products = new Product();
$products->where_not_in_subquery('id', $sub_products)->get();

E se você precisa selecionar por exemplo todos os produtos que não estão relacionados com nenhuma categoria é só fazer um select que atenda na sua subquery, como por exemplo:

$sub_products->select('id')->where_related_category('id > 0');

Tem uma solução diferente? Deixa aí nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *