Frage

Ich bin mit dem Contain Verhalten eine Liste der Kommentare zu bekommen (belongsTo Post, die auf die Anfrage gehört; Frage hasMany Post und Post hasMany Kommentare, die alle diese gehören in Users).

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

Es funktioniert, wenn ich den Abschnitt in den Kommentaren auf Kommentar oben. Ich nehme an, dies zu erwarten ist, aber was ich will, ist all die Beiträge, die gefunden werden, sollten im Interesse des ‚erstellt‘ Feld der ‚User‘ sortiert werden sie gehören. Wie erreichen ich diese tiefere Ebene in CakePHP Sortierung? Ich habe immer bekommen, "Warnung (512): SQL-Fehler: 1054: Unknown column 'User.created' in 'bestellen Klausel'"

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Auch könnte man zu einer Gruppe von einem Fund Anruf auf eine verknüpften Tabelle versuchen, die Verwendung nicht beitritt.

Stellen Sie Ihr Debug-Level auf etwas größer als 1, so dass Sie das Abfrageprotokoll sehen und stellen Sie sicher, dass Kuchen nicht zwei Abfragen tun, um Ihre Daten zu holen. Wenn das der Fall ist, dann wird die erste Abfrage nicht tatsächlich die zweite Tabelle zu verweisen.

Wenn Sie manuell eine Verknüpfung erzwingen, in diesen Situationen können Sie den Ad-Hoc verbindet Methode von Nate unter folgendem Link beschriebene verwendet werden.

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

Andere Tipps

Ich habe zwei Wege gefunden, dies zu umgehen. Die erste ist die zweite Ebene Associacion direkt in das Modell zu definieren. Nun werden Sie überall Zugriff auf diese Daten haben. Es sollte in etwa so aussehen .....

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

Das Problem bei dieser Methode ist, dass es allgemeine Fragen mehr machen könnte komplexer als sie sein müssen. Sie können damit auch die zweite Ebene Abfragen direkt in te finden oder Paginieren Anweisung hinzufügen wie folgt: (Anmerkung: Ich fand, dass Sie aus irgendeinem Grunde nicht schließt sich die $ belongsTo Verbände in der zweiten Ebene verwenden und benötigen sie neu zu definieren, wenn sie sind bereits definiert, z. B. wenn ‚Foo‘ bereits in $ belongsTo definiert ist, müssen Sie ein Duplikat ‚Foo1‘ erstellen, um die Verbandsarbeit zu machen, wie das Beispiel unten).

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

Ich hoffe, das ist klar genug zu verstehen, und dass es hilft jemand.

Überprüfen Sie die rekursive Wert. Wenn es zu ist zu begrenzen, wird es die contain Links ignorieren, IIRC. Ich erinnere mich an ein paar Mal in diesem stoßen. Ich würde versuchen, mehrere Modelle enthalten, aber meine recursive Option wurde auf 0 und nichts würde gezogen bekommen. Für Ihr Beispiel, würde ich denken, dass ein Wert von 1 (Standardeinstellung) ausreichen würde, aber vielleicht haben Sie es explizit zu 0 irgendwo einstellen?

Sie können, bevor Sie Ihren Anruf fügen Sie die folgende finden ():

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

Ja, ich konnte nicht herausfinden, wie Art auf dem zugehörigen / verknüpften Modell basiert, so endete die Set::sort() Methode. Kasse dieser Artikel eine gute Erklärung.

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

... Und ja, es sollte wohl ein Category->find() sein, aber leider ist der ursprüngliche Entwickler hat es keinen Code auf diese Weise, und ich wollte nicht die Ansichten überarbeitet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top