Я пытаюсь создать свои собственные MySQL-запросы в Cakephp.
Это мой LocationsController.php
:
<?php App::uses('Location', 'Model'); class LocationsController extends AppController { public $helpers = array('Html', 'Form'); function index() { $this->loadModel("Location"); $this->Location->get(); } }
Это мой LocationModel.php
:
<?php App::uses('AppModel', 'Model'); class LocationModel extends Model { public $name = 'Location'; public function get() { $this->Location->query("SELECT * FROM locations;"); } }
Как вы можете видеть, я просто пытаюсь выполнить простой запрос, но он не работает. Я получаю эту ошибку:
Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'get' at line 1
Когда я использую один из магических методов, таких как find («all»), он работает …
Вы видите, в чем проблема? Я действительно не могу, и я только пытаюсь сделать простую задачу!
Имя класса вашей модели местоположения должно быть « Location
, а не « LocationModel
.
Из-за этого CakePHP будет генерировать «общую» модель для таблицы базы данных Locations и использовать эту модель вместо вашей собственной модели. Поскольку эта обобщенная модель не имеет метода get()
, она будет выполнять get
как оператор SQL, вызывая ошибку
Кроме того, внутри модели вы не должны использовать $this->Location->query();
, но просто $this->query();
Контроллер местоположения должен быть:
<?php App::uses('Location', 'Model'); // Y do u need this? class LocationsController extends AppController { public $helpers = array('Html', 'Form'); function index() { $this->loadModel("Location"); $this->LocationModel->getLocations(); // I will strongly discourage using get() } }
Модель местоположения должна быть:
<?php App::uses('AppModel', 'Model'); class LocationModel extends Model { public $name = 'Location'; public function getLocations() // Try to avoid naming a function as get() { /** Choose either of 2 lines below **/ return $this->query("SELECT * FROM locations;"); // if table name is `locations` return $this->query("SELECT * FROM Location;"); // if table name is `Location` since your public name is `Location` } }