Список фильтра CakePHP по слагу вместо ID - PullRequest
2 голосов
/ 03 октября 2011

Я использую 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

, поэтому URL будет:http://localhost/cars/ford

Любые идеи или общие направления информации?

1 Ответ

4 голосов
/ 03 октября 2011

Вы можете использовать findBy() или findAllBy() для получения записей, основанных на чем-то отличном от ID. Если вам нужно указать условия для запроса, используйте обычные find():

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

Кроме того, для URL, который вы пытаетесь настроить, вам необходимо создать маршрут для /cars:

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

Edit:

Вышеуказанное работает, если ваши условия основаны на прямой связи с вашей моделью. Если ваши условия находятся на рекурсивной ассоциации (например, 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
    )
));
...