Pergunta

Estou usando o comportamento contendo para obter uma lista de comentários (pertencem a postagem, que pertence à pergunta; pergunta HasMany Post e postagem de comentários HasMany; todos eles pertencem aos usuários).

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);

Funciona, quando eu comento a seção nos comentários acima. Suponho que isso seja esperado, mas o que eu quero são todas as postagens encontradas, devem ser classificadas na ordem do campo 'criado' do 'usuário' ao qual pertencem. Como faço para realizar essa classificação mais profunda no CakePhp? Eu sempre entendo, "Aviso (512): SQL ERRO: 1054: coluna desconhecida 'User.created' in 'Order Cláusula'"

Obrigado pela ajuda!

Foi útil?

Solução

Além disso, você pode estar tentando agrupar em uma tabela relacionada a partir de uma chamada que não usa junções.

Defina seu nível de depuração para algo maior que 1 para que você possa ver o log de consultas e verifique se o bolo não está fazendo duas consultas para buscar seus dados. Se for esse o caso, a primeira consulta não está realmente referenciando a segunda tabela.

Se você deseja forçar manualmente uma junção nessas situações, pode usar o método ad-hoc, descrito por Nate no link a seguir.

http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

Outras dicas

Eu encontrei duas maneiras de contornar isso. O primeiro é definir a associação de segundo nível diretamente no modelo. Agora você terá acesso a esses dados em todos os lugares. Deve parecer algo assim .....

var $belongsTo = array(
'Foo' => array(
  'className' => 'Foo', //unique name of 1st level join ( Model Name )
  'foreignKey' => 'foo_id', //key to use for join
  'conditions' => '',
  'fields' => '',
  'order' => ''
),
'Bar' => array(
  'className' => 'Bar', //name of 2nd level join ( Model Name )
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
  ),
  'fields' => '',
  'order' => ''
)
);

O problema com esse método é que ele pode tornar as consultas gerais mais complexas do que precisam. Assim, você também pode adicionar as consultas de segundo nível diretamente à declaração TE Find ou Paginate da seguinte forma: (Nota: Descobri que, por algum motivo, você não pode usar as associações de pertencer no segundo nível e precisará redefini -las se elas já estão definidos. Por exemplo, se 'Foo' já estiver definido em $ pertencente, você precisa criar um 'Foo1' duplicado para fazer a associação funcionar, como o exemplo abaixo.)

$options['joins'] = array(

array('table' => 'foos',
  'alias' => 'Foo1',
  'type' => 'inner',
  'conditions' => array(
    'CurrentModel.foo_id = Foo1.id'
  )
),
array('table' => 'bars',
  'alias' => 'Bar',
  'type' => 'inner',
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo1.bar_id'
  )
)
);

$options['conditions'] = array('Bar.column' => "value");
$this->paginate = $options;
$[modelname] = $this->paginate();
$this->set(compact('[modelname]'));

Espero que isso seja claro o suficiente para entender e que ajude alguém.

Verifique seu valor recursivo. Se for muito limitante, ignorará os links contêntacos, IIRC. Lembro -me de esbarrar nisso algumas vezes. Eu tentaria conter vários modelos, mas meu recursive a opção foi configurada para 0 E nada seria puxado. Para o seu exemplo, eu pensaria que um valor de 1 (o padrão) seria suficiente, mas talvez você tenha explicitamente 0 em algum lugar?

Você pode adicionar antes da sua chamada para encontrar () o seguinte:

 $this->Question->order = 'Question.created DESC';

Sim, eu não conseguia descobrir como classificar com base no modelo relacionado/associado, então acabou usando o Set::sort() método. Confira Este artigo Para uma boa explicação.

// This finds all FAQ articles sorted by:
// Category.sortorder, then Category.id, then Faq.displaying_order
$faqs = $this->Faq->find('all', array('order' => 'displaying_order'));
$faqs = Set::sort($faqs, '{n}.Category.id', 'ASC');
$faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC');

... e sim, provavelmente deveria ser um Category->find() Infelizmente, porém, o desenvolvedor original não o codificou dessa maneira, e eu não queria refazer as visualizações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top