#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. Смотрите Обновленный ответ, в котором рассматриваются условия для рекурсивных отношений.