복붙노트

[SQL] 교리 2 사용하여 원시 SQL을 실행

SQL

교리 2 사용하여 원시 SQL을 실행

나는 교리 2 사용하여 원시 SQL을 실행하려면

나는 데이터베이스 테이블을 절단하고 기본 테스트 데이터로 테이블을 초기화해야합니다.

해결법

  1. ==============================

    1.여기 교리 내가 뭘 것을 2 원시 쿼리의 예입니다 :

    여기 교리 내가 뭘 것을 2 원시 쿼리의 예입니다 :

    public function getAuthoritativeSportsRecords()
    {   
        $sql = " 
            SELECT name,
                   event_type,
                   sport_type,
                   level
              FROM vnn_sport
        ";
    
        $em = $this->getDoctrine()->getManager();
        $stmt = $em->getConnection()->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
    }   
    
  2. ==============================

    2.

    //$sql - sql statement
    //$em - entity manager
    
    $em->getConnection()->exec( $sql );
    
  3. ==============================

    3.난 당신이 PDO를 사용하는 가정이 작업을 수행하여 작업에있어.

    난 당신이 PDO를 사용하는 가정이 작업을 수행하여 작업에있어.

    //Place query here, let's say you want all the users that have blue as their favorite color
    $sql = "SELECT name FROM user WHERE favorite_color = :color";
    
    //set parameters 
    //you may set as many parameters as you have on your query
    $params['color'] = blue;
    
    
    //create the prepared statement, by getting the doctrine connection
    $stmt = $this->entityManager->getConnection()->prepare($sql);
    $stmt->execute($params);
    //I used FETCH_COLUMN because I only needed one Column.
    return $stmt->fetchAll(PDO::FETCH_COLUMN);
    

    당신은 당신의 요구에 맞게에는 fetch_type을 변경할 수 있습니다.

  4. ==============================

    4.관리자에 끼어 새로운 연결을 만들 :

    관리자에 끼어 새로운 연결을 만들 :

    $manager = $this->getDoctrine()->getManager();
    $conn = $manager->getConnection();
    

    쿼리 및 fetchAll 만들기 :

    $result= $conn->query('select foobar from mytable')->fetchAll();
    

    이 같은 결과에서 데이터를 가져 오기 :

    $this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
    
  5. ==============================

    5.나는 대답은 아마도 발견 :

    나는 대답은 아마도 발견 :

    출처 : 네이티브 SQL.

  6. ==============================

    6.저도 같은 문제가 있었다. 당신은 엔티티 관리자가 제공 한 연결 개체를보고 싶지 :

    저도 같은 문제가 있었다. 당신은 엔티티 관리자가 제공 한 연결 개체를보고 싶지 :

    $conn = $em->getConnection();
    

    그런 다음 쿼리 / IT에 대해 직접 실행할 수 있습니다 :

    $statement = $conn->query('select foo from bar');
    $num_rows_effected = $conn->exec('update bar set foo=1');
    

    http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html에서 연결 개체에 대한 문서를 참조하십시오

  7. ==============================

    7.모델에서 (예를 아래에 내가 사용하지만, 자신을 대체했다 간격 날짜의 예입니다 원시 SQL 문을 작성하면 추가를 선택하고있는 경우 -. 실행] () 호출을> fetchall ().

    모델에서 (예를 아래에 내가 사용하지만, 자신을 대체했다 간격 날짜의 예입니다 원시 SQL 문을 작성하면 추가를 선택하고있는 경우 -. 실행] () 호출을> fetchall ().

       $sql = "DELETE FROM tmp 
                WHERE lastedit + INTERVAL '5 minute' < NOW() ";
    
        $stmt = $this->getServiceLocator()
                     ->get('Doctrine\ORM\EntityManager')
                     ->getConnection()
                     ->prepare($sql);
    
        $stmt->execute();
    
  8. ==============================

    8.당신은, 교리 2 원시 쿼리를 허용하지 않습니다 수 없습니다. 당신은 그러나 당신이 뭔가를 시도 할 경우 것처럼 보일 수 있습니다 :

    당신은, 교리 2 원시 쿼리를 허용하지 않습니다 수 없습니다. 당신은 그러나 당신이 뭔가를 시도 할 경우 것처럼 보일 수 있습니다 :

    $sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
    $em = $this->getDoctrine()->getManager();
    $em->getConnection()->exec($sql);
    

    교리는 DATE_FORMAT 알 수없는 기능입니다 없다는 오류 침을 것입니다.

    하지만 내 데이터베이스 (MySQL은) 그래서 기본적으로이 생긴 어떤 교리가 배후에서 해당 쿼리를 파싱 (그리고 뒤로)과 식을 찾는 것이 이해하지 않는, 무효로 쿼리를 고려하고, 그 기능을 알고 않습니다.

    나처럼 당신은 단순히 데이터베이스에 문자열을 보내고 그것을 처리 할 수 ​​있습니다 (그리고 개발자는 보안에 대한 모든 책임을 보자) 싶다면, 그것을 잊지.

    물론 당신은 어떤 방식 으로든 것을 허용하는 확장을 코딩 할 수 있지만, 당신은뿐만 아니라 그것을 떨어져을하고 그것의 ORM의 사업입니다에 교리를 떠나 mysqli를 사용하여.

  9. from https://stackoverflow.com/questions/3325012/execute-raw-sql-using-doctrine-2 by cc-by-sa and MIT license