1
votes

The subject may be a common question but I have a bit more deeper problem. I am a freshman in CakePhp and already googled the issue. Unfortunately I could not find my exact solution.

My database structure is below with two tables and I used cakePhp naming conventions:

- news (id, news_title, news_text, is_active, created, modified)

- news_images (id, news_id, image_src, is_default, created, modified)

Each news has many images. But one image is being selected as default to-be used as a thumbnail in homepage.

In news listing pages, I want to list all news with a thumbnail. Thumbnail means, news_images.is_default=true

So I have to make a hasMany relationship but filtering with is_default=true

If I simply fetched data after hasMany and belongsTo relationship without using any conditions, it's retrieving all images. And I could not succeeded bingModal or container while I am too new to cakePhp.

I would like to request your help. Thanks in advance.

3
What version of Cakephp is this? - AgRizzo
likely your associations aren't correct, but without seeing the associations or the find you're trying to do (basically any of the pertinent code), it's going to be difficult to help. - Dave
@harunsarac , I will prefer this solution for database: news (id, news_title, news_text, is_active, created, modified, news_images_id) news_images (id, news_id, image_src, created, modified) with news_images_id (follow CakePHP naming convention) is featured image (for thumbnail) - Do Nhu Vy
@AgRizzo CakePHP 2.6.3 The associations are like that: News Model (News.php) class News extends AppModel { public $hasMany = array('news_image' => array( 'conditions' => array('news_image.is_default' => true) ) ); } And NewsImage.php class NewsImage extends AppModel{ public $belongsTo = array('News'); } Thanks - hrnsarac
@DoNhuVy Thanks for your offer. I will edit my db structure as you mentioned. But how should I set my associations in my models? I have two models, News and NewsImage. News: public $hasMany = array('news_image'); NewsImage: public $belongsTo = array('News'); Or should News be $hasOne? I could not decided as a freshman? Thanks again. - hrnsarac

3 Answers

2
votes

There are two main ways to accomplish what you want.

A: Find Contain With Conditions

$data = $this->News->find('all', array(
    'contain' => array(
        'NewsImage' => array(
            'conditions' => array(
                'is_default' => true
            )
        )
    )
));

B: Add Second Association to News model with Conditions

This is the better method if you're going to perform this find call in more than one place.

In model News (news.php):

public $hasMany = array(
    'Image' => array(
        'className' => 'Image',
        'foreignKey' => 'news_id',
        'dependent' => false,
    ),
    'NewsThumbnail' => array(
        'className' => 'NewsImage',
        'foreignKey' => 'news_id',
        'conditions' => array('is_default' => true),
        'dependent' => false,
    )
);

Now you can find news, containing NewsThumbnail, and the conditions will be automatically applied.

$data = $this->News->find('all', array(
    'contain' => array(
        'NewsThumbnail'
    )
));

Note: If you add further conditions in the contain here, they will override the conditions set up in the model association, so you'll have to include them again.

0
votes

Database:
enter image description here
(in table images, news_id is foreign key)

Model News (news.php):

public $hasMany = array(
    'Image' => array(
        'className' => 'Image',
        'foreignKey' => 'news_id',
        'dependent' => false,
    )
);


Model Image (image.php):

public $belongsTo = array(
    'News' => array(
        'className' => 'News',
        'foreignKey' => 'news_id',
    )
);
0
votes

Thanks for that. I am improving myself in CakePhp with your perfect tips. Tried to combine the tips.

1) Re-structured db by the offer of @DoNhuVy:
news: id, title.., news_image_id
news_images: id, src.., news_id

2) Then used your models as below @corie-slate

class News extends AppModel {
 public $hasMany = array(
  'Image' => array(
   'className' => 'Image',
   'foreignKey' => 'entry_id',
   'dependent' => false),
  'NewsThumbnail' => array(
   'className' => 'NewsImage',
   'foreignKey' => 'entry_id',
   'dependent' => false));
}

Until here, is everything right?