Question

J'utilise le comportement maîtrisable pour obtenir une liste des commentaires (belongsTo Post, qui appartient à la question, la question hasMany Post et post hasMany Commentaires, tous ces appartiennent à des utilisateurs).

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

Il fonctionne, quand je commente la section dans les commentaires ci-dessus. Je suppose que cela est à prévoir, mais ce que je veux est tous les messages qui se trouvent, doivent être classés dans l'ordre du champ « créé » du « utilisateur » auquel ils appartiennent. Comment puis-je accomplir ce niveau plus profond tri CakePHP? Je reçois toujours, "Avertissement (512): erreur SQL: 1054: Unknown column 'User.created' dans 'clause ORDER'"

Merci pour votre aide!

Était-ce utile?

La solution

En outre, vous pouvez essayer de regrouper sur une table liée d'un appel de découverte qui n'utilise pas les jointures.

Définissez votre niveau de débogage à une valeur supérieure à 1 afin que vous puissiez voir le journal de requêtes et assurez-vous que le gâteau ne fait pas deux requêtes pour récupérer vos données. Si tel est le cas, alors la première requête ne référence pas en fait la deuxième table.

Si vous voulez forcer manuellement une jointure dans ces situations, vous pouvez utiliser le Ad-Hoc rejoint méthode décrite par Nate au lien suivant.

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

Autres conseils

Je l'ai trouvé deux façons de contourner ce problème. La première consiste à définir le deuxième niveau Associacion directement dans le modèle. Maintenant, vous aurez accès à ces données partout. Il devrait ressembler à ceci .....

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' => ''
)
);

Le problème avec cette méthode est qu'il pourrait faire des requêtes générales plus complexes qu'ils besoin. Vous pouvez ainsi ajouter également les deuxièmes requêtes de niveau directement dans te trouver ou paginate énoncé comme suit: (Note: Je trouve que pour une raison quelconque, vous ne pouvez pas utiliser les belongsTo de $ au deuxième niveau des jointures et devra les redéfinir si elles sont déjà définis. par exemple, si « Foo » est déjà défini dans $ belongsTo, vous devez créer un doublon « Foo1 » pour faire le travail d'association, comme dans l'exemple ci-dessous.)

$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]'));

J'espère que cela est suffisamment clair pour comprendre et que cela aide quelqu'un.

Vérifiez votre valeur récursive. Si elle est trop restrictive, il ignore les liens maîtrisables, IIRC. Je me souviens heurtant à quelques reprises. Je vais essayer contenant plusieurs modèles, mais mon option recursive a été fixé à 0 et rien ne serait tiré. Pour votre exemple, je pense qu'une valeur de 1 (par défaut) suffirait, mais peut-être que vous avez défini explicitement à 0 quelque part?

Vous pouvez ajouter avant votre appel à trouver () ce qui suit:

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

Oui, je ne pouvais pas trouver comment trier en fonction du modèle associé / associé, donc fini par utiliser la méthode Set::sort(). Commander cet article une bonne explication.

// 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');

... Et oui, il devrait probablement être un Category->find() mais malheureusement le développeur original n'a pas coder cette façon, et je ne veux pas retravailler les vues.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top