Tentando obter dados de “Cidade” de Evento-> Local-> Cidade usando 'contém' no CakePHP
-
28-10-2019 - |
Pergunta
Estou tentando retornar uma lista de events
e incluir o city
onde está ocorrendo.A cidade é associada apenas por meio do Venue
do evento.
Abaixo está o código que estou usando.Ele retorna todos os dados corretos, mas não retorna NENHUM dado de cidade (exceto o campo city_id em Venue - que não tenho certeza do motivo pelo qual está retornando).
Associações:
Event belongsTo Venue
Venue hasMany Event
Venue belongsTo City
City hasMany Venue
Código:
$this->Event->Behaviors->attach('Containable');
$events = $this->Event->find('all', array(
'limit' => 5,
'order' => 'Event.created DESC',
'fields' => array(
'name',
'description',
'phone',
'price_general',
'price_child',
'price_adult',
'price_child',
'tickets_url'
),
'contain' => array(
'Venue' => array(
'fields' => array(
'name',
'address',
'city_id',
),
'City' => array(
'fields' => array(
'City.name',
'state'
),
'conditions' => array(
'City.id' => 'Venue.city_id'
)
)
),
'Schedule' => array(
'fields'=>array(),
'Date' => array(
'conditions'=>array(
'Date.start >=' => $start_date,
'Date.start <=' => $end_date,
)
)
)
),
));
Resposta bônus: (que eu já perguntei em outra questão StackOverflow ) - As condições de data devem filtrar quais eventos aparecem, mas, em vez disso, estão filtrando apenas quais dados de data mostrar.
RESPOSTA DE TRABALHO: (obrigado bancário)
$this->Event->recursive = -1;
$options['joins'] = array(
array('table' => 'schedules',
'alias' => 'Schedule',
'type' => 'LEFT',
'conditions' => array(
'Event.id = Schedule.event_id',
)
),
array('table' => 'dates',
'alias' => 'Date',
'type' => 'LEFT',
'conditions' => array(
'Date.schedule_id = Schedule.id',
)
)
);
$options['fields'] = array(
'Event.name',
'Schedule.start_date',
'Date.start',
);
$options['limit'] = 5;
$events = $this->Event->find('all', $options);
Solução
Eu recomendaria evitar o uso de Containable.Em alguns casos, ele gera muitas consultas.Uma maneira melhor de fazer consultas complexas é juntar tabelas "manualmente" .
Outra opção que eu consideraria em primeiro lugar é pesquisar através do modelo 'Local' sem usar Containable como este: $this->Event->Venues->find('all', ...)
.Como locais diretamente associados a cidades e eventos, deve ser possível obter o que você deseja sem complexidades extras.
Atualização: dê uma olhada na pergunta Como alterar a sequência de 'junções' no CakePHP?
Outras dicas
em vez de conter, você tentou incluir os dados da cidade nos próprios campos por campos=> matriz ('', '', 'Cidade.nome)