Привет всем, у меня проблемы с запросом доктрины. Запрос очень простой и управляется следующим образом:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\View\View;
use AppBundle\Entity\Product;
class ProductController extends FOSRestController
{
/**
* @Rest\Get("/product")
*/
public function getAction()
{
$em = $this->getDoctrine()->getManager();
$restresult = $em->getRepository(Product::class)->findAll();
if ($restresult == null) {
return new View("there are no products exist", Response::HTTP_NOT_FOUND);
}
return $restresult;
}
}
И файл репо:
<?php
namespace AppBundle\Repository;
use Doctrine\ORM\EntityRepository;
class ProductRepository extends EntityRepository
{
public function findAll()
{
$conn = $this->getEntityManager()->getConnection();
$sql = "SELECT p.productName from Product as p ";
$stmt = $conn->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
}
Вместо этого файл конфигурации:
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
unix_socket: /var/lib/mysql/mysql.sock
server_version: '5.5'
charset: UTF8
# if using pdo_sqlite as your database driver:
# 1. add the path in parameters.yml
# e.g. database_path: '%kernel.project_dir%/var/data/data.sqlite'
# 2. Uncomment database_path in parameters.yml.dist
# 3. Uncomment next line:
#path: '%database_path%'
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
но когда я выполняю запрос, Symfony выдает мне эту ошибку:
An exception occurred while executing 'SELECT t0.idUser AS idUser_1, t0.email AS email_2, t0.username AS username_3, t0.password AS password_4 FROM User t0 INNER JOIN user_has_product ON t0.idUser = user_has_product.User_idUser WHERE user_has_product.Product_idProduct = ?' with params [1]:\n\nSQLSTATE[42S02]: Base table or view not found: 1146 Table 'projectKobe.user_has_product' doesn't exist
Я не могу понять, как решить эту проблему и почему запрос не: «ВЫБРАТЬ p.productName FROM Product as p». Я не делал никаких внутренних соединений. Спасибо
код, который вы показываете, и запрос исключения кажутся действительно разными! В коде вы запрашиваете Продукт, за исключением Пользователь. Вы уверены, что это правильный запрос?
не могли бы вы вставить свой класс сущности


Это связано с ORM, поэтому попробуйте обновить схему базы данных.
Вы можете проверить документацию здесь
Официальный документ Собственный SQL
Пример университета КНП Запросы Doctrine Raw SQL
Я только что набрал это: php bin / console doctrine: schema: update --force. Но ошибка та же
я предполагаю, что имя таблицы должно быть в нижнем регистре
Таблица товаров в БД называется «Товар». Таким образом, запрос должен быть в порядке, действительно, если я выполняю доктрину php bin / console: query: sql 'SELECT * FROM Product', он работает. но я не объясняю, как меняется запрос, когда я выполняю его в коде
или используя построитель запросов Doctrine symfony.com/doc/2.8/…
Ничего такого. "Странный" запрос такой же
если вы внимательно посмотрите на этот вопрос, вы увидите, что доктрина ищет db "projectKobe" и таблицу "user_has_product" вместо "Product".
в чем была проблема?
В сущности продукта нет сопоставления с файлом репо. Мне нужно добавить эту строку @ORM \ Entity (repositoryClass = "AppBundle \ Repository \ ProductRep ository"), чтобы решить проблему, и использовать ProductRepository.php для выполнения запросов. findAll () - собственный метод, поэтому, если вы не перезаписываете его, результат запроса будет "странным".
Кроме того, я набираю php bin / console doctrine: query: sql 'SELECT * FROM Product'. Запрос работает нормально