CakePHP фильтрует список по slug вместо ID

#php #database #url #cakephp #slug

#php #База данных #url #cakephp #slug

Вопрос:

Я использую CakePHP, это структура моей базы данных:

КарМейки
----------------------------------
Имя пули идентификатора
16 форд Форд

КарМодели
----------------------------------
Имя идентификатора CarMake_ID
10 Сопровождение 16

Автомобили
----------------------------------
Имя идентификатора CarModel_ID
1 Моя машина 10

Я хочу просмотреть список автомобилей по автопроизводителям.Slug

таким образом, URL-адрес будет следующим: http://localhost/cars/ford

Есть какие-нибудь идеи или общие направления информации?

Ответ №1:

Вы можете использовать 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] '
   )
);
  

Редактировать:

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

Комментарии:

1. Большое спасибо, что приложили усилия, чтобы написать это для меня, я попробую.

2. Я попробовал это прошлой ночью, я вижу, что он делает сейчас, но я получаю эту ошибку SQL: `Ошибка SQL: 1054: неизвестный столбец’CarMake. Slug’ в предложении where’ [CORE/cake/libs/model/datasources/dbo_source.php , строка 684]

3. Есть ли у вас связь между Car и CarMake, определенная в вашей модели?

4. Нет только Car и CarModel, между ними на самом деле нет прямой связи: ` var $belongsTo = array( ‘Carmodel’ => array( ‘className’ => ‘Carmodel’, ‘ForeignKey’ => ‘carmodel_id’, ‘conditions’ => «, ‘fields’ =>», ‘order’ => » ) );

5. Смотрите Обновленный ответ, в котором рассматриваются условия для рекурсивных отношений.