Problema no Laravel 5 com wherePivot
Estou trabalhando com o Laravel 5 e estou tendo problemas para obter->wherePivot()
para trabalhar em um relacionamento muitos-para-muitos. Quando eudd()
o SQL parece que o Eloquent está procurando registros na tabela dinâmica com um `pose_state` .pose_id` é nulo`.
Espero que seja um erro simples e não um bug. Todas as idéias são apreciadas.
Estrutura do banco de dadospose
id
name
type
Estado
id
name
machine_name
pose_state
pose_id
state_id
status
ModelosPose
<?php namespace App;
use DB;
use App\State;
use Illuminate\Database\Eloquent\Model;
class Pose extends Model {
public function states()
{
return $this->belongsToMany('App\State')
->withPivot('status_id')
->withTimestamps();
}
public function scopeWithPendingReviews()
{
return $this->states()
->wherePivot('status_id',10);
}
}
Estado
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class State extends Model {
public function poses()
{
return $this->belongsToMany('Pose')
->withPivot('status_id')
->withTimestamps();
}
}
Função PosesController
public function listPosesForReview(){
$poses = Pose::withPendingReviews()->get();
dd($poses->toArray() );
}
SQL
select
`states`.*, `pose_state`.`pose_id` as `pivot_pose_id`,
`pose_state`.`state_id` as `pivot_state_id`,
`pose_state`.`status_id` as `pivot_status_id`,
`pose_state`.`created_at` as `pivot_created_at`,
`pose_state`.`updated_at` as `pivot_updated_at`
from
`states` inner join `pose_state` on `states`.`id` = `pose_state`.`state_id`
where
`pose_state`.`pose_id` is null and `pose_state`.`status_id` = ?
EDITARQuando atualizei meu código para remover o escopo, ele funcionou. Obrigado @Deefour por me colocar no caminho certo! Talvez o escopo tenha algo a mais que esteja faltando.
public function pendingReviews()
{
return $this->states()
->wherePivot('status_id','=', 10);
}
AINDA OUTRA EDIÇÃOFinalmente consegui que isso funcionasse. A solução acima estava me fornecendo entradas duplicadas. Não faço ideia por que isso funciona, mas funciona, então eu continuarei.
public function scopeWithStatusCode($query, $tag)
{
$query->with(['states' => function($q) use ($tag)
{
$q->wherePivot('status_id','=', $tag);
}])
->whereHas('states',function($q) use ($tag)
{
$q->where('status_id', $tag);
});
}