【问题标题】:Multiple database join query in SymfonySymfony 中的多数据库连接查询
【发布时间】:2021-09-03 10:28:07
【问题描述】:

我是 symfony 的新手,我需要加入来自多个数据库的查询。我遇到了许多类似的问题,但我无法解决这个问题。我尝试在存储库中加入查询,但收到错误“在链配置的命名空间 App\Entity\Steuer\StUserSendAuth 中找不到类 'App\Entity\customerdata\CustomerAction' ”。 下面我已经添加了代码,使用了。

我的学说.yaml

doctrine:
    dbal:
        default_connection: default
        connections:
            steuer:
                # configure these for your database server
                url: '%env(resolve:DATABASE_STEUER_URL)%'
                driver: 
            kundendaten:
                # configure these for your database server
                url: '%env(resolve:DATABASE_CUSTOMERDATA_URL)%'
                driver: 
            
    orm:
        default_entity_manager: default
        entity_managers:
            steuer:
                connection: steuer
                mappings:
                    Steuer:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Steuer'
                        prefix: 'App\Entity\Steuer'
                        alias: Steuern
            customerdata:
                connection: customerdata
                mappings:
                    Customerdata:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Customerdata'
                        prefix: 'App\Entity\Customerdata'
                        alias: Customerdata

第一个数据库实体:-

namespace App\Entity\Steuer;

use Doctrine\ORM\Mapping as ORM;

/**
 * StUserSendAuth
 * @ORM\Entity(repositoryClass="App\Repository\Steuern\StUserSendAuthRepository")
 * @ORM\Table(name="st_user_send_auth")
 */
class StUserSendAuth
{
    /**
     * @var int
     *
     * @ORM\Column(name="abgabe_sendauth_id", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $abgabeSendauthId = '0';

    /**
     * @var int
     *
     * @ORM\Column(name="customeraction_id", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $CustomeractionId = '0';

第二个数据库连接实体:-

namespace App\Entity\customerdata;

use Doctrine\ORM\Mapping as ORM;

/**
 * CustomerAction
 * @ORM\Entity(repositoryClass="App\Repository\customerdata\CustomerActionRepository")
 * @ORM\Table(name="customer_action")
 */
class CustomerAction
{
    /**
     * @var int
     *
     * @ORM\Column(name="customeraction_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $CustomeractionId;

加入查询的存储库:-

namespace App\Repository\Steuer;

use App\Entity\Steuer\StUserSendAuth;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method StUserSendAuth|null find($id, $lockMode = null, $lockVersion = null)
 * @method StUserSendAuth|null findOneBy(array $criteria, array $orderBy = null)
 * @method StUserSendAuth[]    findAll()
 * @method StUserSendAuth[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 * @method StUserSendAuth|null findstatistikOnline()
 */
class StUserSendAuthRepository extends ServiceEntityRepository
{
    /**
     * @return StUserSendAuth[] Returns an array of StUserSendAuth objects
     */
    public function findstatistikOnline()
    {

        return $this->getEntityManager()
            ->createQueryBuilder('s')
            ->select('p.updatedAt')
            ->from('App\Entity\Steuern\StUserSendAuth', 'p')
            ->leftJoin('App\Entity\customerdata\CustomerAction', 'uas', 'WITH', 'uas.CustomeractionId = p.CustomeractionId')
            ->getQuery()
            ->getArrayResult()
        ;

控制器类:-

namespace App\Controller;

use App\Repository\Steuer\StUserSendAuthRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class OnlineAuswertungController extends AbstractController
{
    #[Route('/count_statistik/onlineAuswertung', name: 'onlineAuswertung')]
    public function index(StUserSendAuthRepositoryRepository $StUserSendAuthRepositoryRepository): Response
    {
$Table = $StUserSendAuthRepositoryRepository->findstatistikOnline();

        return $this->render('online_auswertung/index.html.twig', [
            'controller_name' => 'OnlineAuswertungController',
            'table' => $Table,
        ]);
    }
}

请告诉我如何在多个数据库上进行查询。谢谢!

【问题讨论】:

    标签: php symfony doctrine-orm doctrine multiple-databases


    【解决方案1】:

    1.如果你想实现数据库的多连接,那么请参考这个文档。 https://symfony.com/doc/current/doctrine/multiple_entity_managers.html.

    1. 请通过模式验证来验证您在项目中创建的实体。

    2. 如果你试图从同一个数据库的两个不同的表中获取。那么语法是here

    示例:

    ...
    $this->getEntityManager()
            ->createQueryBuilder('s')
            ->select('p.updatedAt')
            ->from('Steuern:StUserSendAuth', 'p')
            ->leftJoin('customerdata:CustomerAction', 'uas', 'WITH', 'uas.CustomeractionId = p.CustomeractionId')
            ->getQuery()
            ->getArrayResult()
    

    ...

    注意: 请检查此reference

    【讨论】:

    • @Aishwarya m k,谢谢你的回答。 1)=数据库的多个连接对我来说工作正常。 2)模式验证也运行良好。但是3)我试图从两个不同数据库的两个不同表中获取。如果有这方面的语法,请告诉我。
    • @pramod 请检查此堆栈溢出问题以进一步指导您。 stackoverflow.com/questions/32127481/…
    【解决方案2】:

    我终于得到了symfony中多数据库查询的解决方案。

    1. 首先需要将所有实体类中的表名重命名为databasename.tablename。
    namespace App\Entity\Steuer;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * StUserSendAuth
     * @ORM\Entity(repositoryClass="App\Repository\Steuer\StUserSendAuthRepository")
     * @ORM\Table(name="steuer.st_user_send_auth")
     */
    class StUserSendAuth
    {
        /**
         * @var int
         *
         * @ORM\Column(name="abgabe_sendauth_id", type="integer", nullable=false, options={"unsigned"=true})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $abgabeSendauthId = '0';
    
        /**
         * @var int
         *
         * @ORM\Column(name="customeraction_id", type="integer", nullable=false, options={"unsigned"=true})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $CustomeractionId = '0';
    
    1. 我尝试在控制器中使用 raw_sql。
    class OnlineAuswertungController extends AbstractController
    {
        #[Route('/count_statistik/onlineAuswertung', name: 'onlineAuswertung')]
        public function index(Connection $connection): Response
        {
           $query = "SELECT p.updated_at
                     FROM steuer.st_user_pdfs_sendauth p
                      LEFT JOIN customerdata.CustomerAction sa on sa. customeraction_id = p.customeraction_id"
          $statement = $connection->prepare($query);
            $statement->execute();
    
            return $this->render('online_auswertung/index.html.twig', [
                'controller_name' => 'OnlineAuswertungController',
                'table' => $Table,
            ]);
        }
    }
    

    我无法使用 $statement->fetchAll();因为它显示 fetchAll() 已被弃用。目前这段代码运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多