2009-07-13 4 views
0

пожалуйста, помогите мне, я действительно борюсь с этим ...post habtm postlover: как заказывать сообщения по количеству отправителей?

Авторы могут писать пост, и авторы могут любить другие автор сообщение ...

Так посты принадлежат автору (когда авторы пишут их), но сообщения habtm авторов (когда авторы их любят).

Например, я бы хотел получать сообщения, упорядоченные по количеству отправителей и , созданные за последние 24 часа. Вот мои модели и присоединиться таблицы:

ТАБЛИЦА: lovedposts_postlovers ID: INT lovedpost_id: INT postlover_id: INT

POST МОДЕЛЬ

<?php 
class Post extends AppModel { 
var $name = 'Post'; 
var $belongsTo = 'Author'; 

var $hasAndBelongsToMany = array(
     'Postlover' => 
      array(
       'className'    => 'Author', 
       'joinTable'    => 'lovedposts_postlovers', 
       'foreignKey'    => 'lovedpost_id', 
       'associationForeignKey' => 'postlover_id', 
       'unique'     => true 
      ) 
    ); 

var $displayField = 'title'; 

} 

?> 

АВТОР МОДЕЛЬ

<?php 
class Author extends AppModel { 
var $name = 'Author'; 
var $hasMany = 'Post'; 

var $hasAndBelongsToMany = array(
     'Lovedpost' => 
      array(
       'className'    => 'Post', 
       'joinTable'    => 'lovedposts_postlovers', 
       'foreignKey'    => 'postlover_id', 
       'associationForeignKey' => 'lovedpost_id', 
       'unique'     => true 
      ) 

    ); 

var $displayField = 'username'; 

} 

?> 

ответ

0

Ваш лучший опция заключается в запросе на joinModel. Обычно это было бы:

$this->Author->AuthorsLovedpost->find(...); 

Но так как вы не придерживаться конвенций торта именования для таблицы, которые могут или не могут быть разными. CreateModel автоматически создается BTW, но вы также можете явно указать его в объявлении HABTM.

var $hasAndBelongsToMany = array(
    'Postlover' => array(
     ..., 
     'with' => 'joinModelName' 
    ) 
); 

Для найти варианты вы можете делать все, что вам нужно, и 'group' => 'post_id''order' => 'COUNT(post_id)' или что-то, что продлить. То, что вы ищете, - это правильный набор «post_ids».

С точки зрения joinModel модели Author and Post принадлежат к отношениям. Cake найдет соответствующие результаты соответственно, и вы можете использовать обычные параметры 'contain' и т. Д. Для фильтрации результатов.

Надеюсь, что это поможет.

+0

Почему я не придерживаюсь условностей именования торта? – checcco

+0

Таблица должна быть 'authors_posts'. http://book.cakephp.org/view/24/Model-and-Database-Conventions – deceze

+0

Кстати, я просто имел в виду, что я не уверен в своей голове, если имеет значение то, что вы называете таблицей. Я не могу вспомнить, основывает ли Cake имена модели на таблице или на пользовательском связанном имени модели. Вы, конечно, можете назвать свои таблицы и модели, как вам нравится. – deceze

0

Я думаю, вы должны сделать шаг назад и попытаться прочитать документацию (book.cakephp.org). Попробуйте сделать демонстрацию, используя свои примеры.

  • lovedposts_postlovers table очень сбивает с толку и, возможно, его следует называть чем-то другим, возможно, author_posts или даже фаворитами. ну, это может быть что угодно, если вы укажете его в «joinTable».
  • lovedposts_postlovers должны иметь поля AUTHOR_ID, POST_ID

    // POST МОДЕЛЬ вар $ hasAndBelongsToMany = массив ( 'Автор' => массив ( 'имя класса' => 'Автор', 'joinTable' => 'lovedposts_postlovers', 'foreignKey' => 'author_id', 'associationForeignKey' => 'post_id', 'unique' => true ) );

Например, я хотел бы получить сообщения, упорядоченные по количеству почтовых отправителей и созданные за последние 24 часа. Вот мои модели и присоединиться к таблице:

$this->Post->LovedPosts->find('all', array('fields'=>array('Post.title', 'count(LovedPosts.*) as favorited'), 'group'=>'LovedPosts.post_id'); 

В основном вы хотите сделать запрос SELECT COUNT и группы, по POST_ID и этот код должен получить Вас на правильном пути. Примечание. Я не тестировал этот код. Вам также нужно предложение порядка в этой операции поиска, но я оставлю это вам.

 Смежные вопросы

  • Нет связанных вопросов^_^