Esta es la respuesta más completa que encomtrarás brindar, sin embargo obsérvala pausadamente y analiza si es compatible a tu trabajo.
Solución:
Laravel 4.1 trae nativo wherePivot
y orWherePivot
métodos, que es directamente una solución a mi problema.
Cuando sea que llames withPivot('foo')
Laravel haces:
SELECT ... `table`.`foo` AS `pivot_foo` FROM `table` ...
Respuesta fija:
MySQL en particular permite el uso de alias de columna en HAVING
, GROUP BY
y ORDER BY
cláusulas, pero no en WHERE
cláusulas.
Ambas cosas HAVING
y WHERE
se utilizan para filtrar consultas, pero se comportan de forma ligeramente diferente: HAVING
se aplica después GROUP BY
y WHERE
es antes
Como regla general de SQL, no debe usar alias de columna (pivot_foo
en ese caso) para agrupar, filtrar o algo por el estilo, ya que puede que no funcione con otras bases de datos SQL.
Aunque no se recomienda, es posible utilizar:
return User::find(1)->works()->having('pivot_active','=','1')->get();
Intento configurar todas las relaciones en ambas direcciones, ya que esto permite el uso de propiedades dinámicas, por ejemplo $user->works()
.
class Collection extends Eloquent
public function contents()
return $this->belongsToMany('Content', 'collection_content', 'collection_id', 'content_id')->withPivot('collection_id', 'group_id', 'field_identifier');
class Content extends Eloquent
public function collections()
return $this->belongsToMany('Collection', 'collection_content', 'collection_id', 'content_id')->withPivot('collection_id', 'group_id', 'field_identifier');
class CollectionContent extends Eloquent
public function content()
return $this->belongsTo('Content');
public function collection()
return $this->belongsTo('Collection');
Entonces consulta:
$works = User::find(1)->works()->where('active', 1)->get();
La documentación de Eloquent es horrible cuando se trata del uso de tablas dinámicas. Este es un gran tutorial: http://www.veloped.be/2013/08/30/laravel-4-pivot-table-example-attach-and-detach/