繁体   English   中英

Doctrine2查询生成器-关联数据无法正确补水

[英]Doctrine2 Query Builder - Associative Data not hydrating correctly

我在X-Cart项目中写了一个比较复杂的查询(将原则用作ORM)。 我必须查询/拉取来自多个表的记录,并确保在相关数据中不会取回无关/空的结果。 这是我遇到的问题:

我有几个内部联接,它们应该仅提取具有关联数据的记录。 我已经让查询吐出了它生成的原始SQL,当直接针对MySQL数据库运行时,它可以100%运行。

我相信对基础模型的关联数据进行混合时会出现问题。

public function getAlbums() {
    // Query Parameters
    $params = $this->params;

    // Base Query
    // TO DO: Associated data is not being hydrated properly by the joins,
    $query = \XLite\Core\Database::getRepo('\XLite\Module\CodeSmith\Albums\Model\Album')
        ->createQueryBuilder('album')
        ->linkInner('album.songs', 'song')
        ->linkInner('song.song_tracks', 'song_track')
        ->linkInner('song_track.album_track', 'track');

    // Init conditions array
    $conditions = [];

    // If school_type is present, check against song's school type
    if(isset($params['school_type'])){
        $conditions[] = $query->expr()->eq('song.school_type', $params['school_type']);
    }

    // If track type is present, check against album_track's track type
    if(isset($params['track_type'])){
        $conditions[] = $query->expr()->eq('track.track_type', "'{$params['track_type']}'");
    }

    // If album name is present, generate OR expression to check against first letter of album name
    // i.e. (first_letter = A OR first_letter = B OR first_letter = C)
    if(isset($params['album_name'])){
        $orX = $query->expr()->orX();
        $name_conditions = array_map(function($letter) use ($query){
            return $query->expr()->eq($query->expr()->substring('album.name', 1, 1), "'$letter'");
        }, explode(',', $params['album_name']));
        $orX->addMultiple($name_conditions);
        $conditions[] = $orX;
    }

    if(isset($params['category'])){
        // TO DO
    }

    if(isset($params['text'])){
        // TO DO
    }


    // Aggregate conditions array with AND
    if(count($conditions)){
        $conditions = call_user_func_array(array($query->expr(), 'andx'), $conditions);
        $query->where($conditions);
    }


    // Fetch Results
    $albums = $query->getQuery()->getResult();


    return $albums;
}

相关数据只是与所有相关数据一起返回。 我不希望所有相关条目,仅希望符合搜索条件的条目。 这是教义的问题,还是我做错了什么?

最终弄清楚了。 我需要利用“提取”联接来确保正确关联数据。 Doctrine的文档仅通过createQuery而非查询构建器显示其示例。

这是我的旧代码:

$query = \XLite\Core\Database::getRepo('\XLite\Module\CodeSmith\Albums\Model\Album')
    ->createQueryBuilder('album')
    ->linkInner('album.songs', 'song')
    ->linkInner('song.song_tracks', 'song_track')
    ->linkInner('song_track.album_track', 'track');

这是通过createQueryBuilder

$query = \XLite\Core\Database::getEM()->createQueryBuilder()
    ->select('album, song, song_track, track')
    ->from('\XLite\Module\CodeSmith\Albums\Model\Album', 'album')
    ->innerJoin('album.songs', 'song')
    ->innerJoin('song.song_tracks', 'song_track')
    ->innerJoin('song_track.album_track', 'track');

select语句可确保获取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM