CakePHP过滤器列表由slug而不是ID

时间:2011-10-03 17:23:17

标签: php database url cakephp slug

我正在使用CakePHP,这是我的数据库的结构:

CarMakes
----------------------------------
ID     Slug     Name
16     ford     Ford

CarModels
----------------------------------
ID     Name     CarMake_ID
10     Escort   16

Cars
----------------------------------
ID     Name     CarModel_ID
1      My car   10

我想通过CarMakes.Slug查看汽车列表

所以网址是: http://localhost/cars/ford

任何想法或一般信息指示?

1 个答案:

答案 0 :(得分:4)

您可以使用findBy()findAllBy()根据ID以外的其他内容检索记录。如果您需要为查询提供条件,请使用常规find()

$this->Car->find(
   'all',
   array(
      'conditions' => array(
         'CarMake.Slug' => $slug,
         'Car.Name LIKE' => $name
      ),
   )
);

此外,对于您尝试设置的网址,您需要为/cars创建route

Router::connect(
   '/cars/:make',
   array('controller' => 'cars', 'action' => 'bymake'),
   array(
      'pass' => array('make'),
      'make' => '[A-Za-z]+'
   )
);

修改

如果您的条件基于您的模型的直接关联,则上述方法有效。如果您的条件是递归关联(即Car-> CarModel-> CarMake),则需要使用显式连接:

$result = $this->Car->find('all', array(
    'joins' => array(
        array(
            'table' => 'car_models',
            'type' => 'inner',
            'foreignKey' => false,
            'conditions' => array('car_models.id = Car.car_model_id')
        ),
        array(
            'table' => 'car_makes',
            'type' => 'inner',
            'foreignKey' => false,
            'conditions' => array(
                'car_makes.id = car_models.car_make_id',
                'car_makes.slug' => $slug
            )
        )
    ),
    'conditions' => array(
        'Car.name LIKE' => $name
    )
));