Symfony에서 Propel ORM을 사용하여 Group By Clause로 SQL 수를 작성하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/933473

  •  06-09-2019
  •  | 
  •  

문제

Propel ORM을 사용하여 다음 SQL 쿼리를 어떻게 작성할 수 있습니까?

SELECT species, COUNT(*) FROM Bird GROUP BY species;

올바른 솔루션이 없습니다

다른 팁

이것은 의미있는 수화로 이어지는 쿼리가 아닙니다. Bird 객체, 당신은 만 선택하기 때문에 species 그 종의 칼럼과 수. 그래서 Colin이 제안한 "RAW"SQL 쿼리 아마도 여기에가는 가장 좋은 방법 일 것입니다. 그러나 마지막에 수화하지 말고 결과에서 데이터를 얻으십시오. PDOStatement.

만약에 species a에 대한 언급이었다 Species 표, 당신은 거기에서 일할 수 있습니다 : 수화물 Species 종당 새 수에 대한 여분의 기둥이있는 물체. 버전 1.2까지 Symfony를 사용하는 경우 DBFinder 플러그인, 그것은 작업을 크게 단순화하기 때문에 Criteria, 단일 보충 열을 선택하는 방법이 있습니다.

$speciesQuery = DbFinder::from('Species')->
  join('Bird')->
  groupBy('Bird.Id')->
  withColumn('COUNT(Bird.Id)', 'NbBirds');

foreach ($speciesQuery->find() as $species) {
  echo $species->getName() . ": " . $species->getNbBirds() . " birds\n";
}

Symfony 1.3 또는 1.4를 사용하는 경우 Bundled Propel 1.4를 Propel 1.5로 업그레이드해야합니다. 여기서 DBFinder의 제작자 인 François Zaniotto는 많은 기능을 포팅하고 더 많이 추가 했으므로 위의 코드는 추가 플러그인없이 Propel 1.5에서 작동합니다.

$c = new Criteria();
$c->addAsColumn('cnt', "count(*)");
self::addSelectColumns($c);
$c->addGroupByColumn(BirdPeer::SPECIES);

그러나 인구가 많은 물체에 계산 해야하는 경우 사용자 정의 수화를 수행해야합니다.

Propel Criteria에 대한 단일 문서를 찾기가 어렵다는 것을 알았으므로 (API 문서가없는 것 같습니다) 일반적으로 Symfony Book의 8 장에서 목록을 사용합니다. 그러나 나는 그것이 포괄적인지 아닌지 전혀 모른다.

그러나 당신이 할 수있는 일은 SQL을 직접 propel로 공급하는 것입니다. 다음은 예제에서 수정됩니다 http://propel.phpdb.org/docs/user_guide/chapters/findingobjects.html:

    $con = Propel::getConnection(DATABASE_NAME);

    // if not using a driver that supports sub-selects
    // you must do a cross join (left join w/ NULL)
    $sql = "SELECT species, COUNT(*) FROM Bird GROUP BY species";

    $stmt = $con->createStatement();
    $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);

    return parent::populateObjects($rs);

나는 내가 가지고 있을지도 모른다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top