使用具有逗号分隔ID的Yii2查询字段,其中condition是数组

时间:2017-06-15 16:29:49

标签: php mysql yii2

是否可以使用ids逗号分隔的字段中检索所有使用id数组查询的记录而不查询每个ID的数据库?

字段 categoriy_id 是一个整数,但字段 categories_tree 是一个varchar,整数用逗号分隔:“2,5,6”

allowedCats 也是一个数组“5,2”

这是我的代码

public function getCarouselLatest() {
    $userID = Yii::$app->user->identity->id;
    $currentUser = UserProfile::find()
            ->where(['user_id' => $userID])
            ->one();
    $integerIDs = array_map('intval', explode(',', $currentUser->categories_tree));

    $latestBooks = Book::find()
            ->published()
            ->where(['in', 'category_id', $integerIDs])
            ->orWhere(new Expression('FIND_IN_SET(:category_to_find, categories_tree)'))
            ->addParams([':category_to_find' => 2])
            ->orderBy([
                'published_at' => SORT_DESC,
            ])
            ->limit(10)
            ->all();

    return $latestBooks;
}

第一个工作正常,但挑战是第二个因为我需要检查数字列表到catagories_tree字段的数字列表。

我现在知道我可以使用FIND_IN_SET

->orWhere(new Expression('FIND_IN_SET(:category_to_find, categories_tree)'))
->addParams([':category_to_find' => 2])

这将产生以下sql:

SELECT * FROM `book` WHERE (`category_id` IN (7, 39)) OR (FIND_IN_SET(2, categories_tree)) ORDER BY `published_at` DESC LIMIT 10

但我需要通过一个id列表搜索,而不仅仅是像FIND_IN_SET中的一个参数

可能,到目前为止,我将使用FIND_IN_SET添加多个行,但我猜这对于DB来说会非常重。

我知道这是一个糟糕的数据库设计,并且ids应该在另一个表中并且只是进行连接,但这涉及到更换许多第三方供应商。

有什么想法吗?

已更新

这是我正在使用的代码,但并不高兴,因为我说不确定真实数据的性能会发生什么......

public function getCarouselLatest() {
    $userID = Yii::$app->user->identity->id;
    $currentUser = UserProfile::find()
            ->where(['user_id' => $userID])
            ->one();
    $integerIDs = array_map('intval', explode(',', $currentUser->categories_tree));
    $latestBooks = Book::find()
            ->published()
            ->where(['in', 'category_id', $integerIDs]);

    foreach ($integerIDs as $cat) {
        $latestBooks = $latestBooks->orWhere(new Expression('FIND_IN_SET(:category_to_find'.$cat.', categories_tree)'))
                ->addParams([':category_to_find'.$cat => $cat]);
    }
    $latestBooks = $latestBooks->orderBy([
                'published_at' => SORT_DESC,
            ])
            ->limit(10)
            ->all();
    return $latestBooks;
}

那个输出:

    SELECT * FROM `book` WHERE ((`category_id` IN (7, 39)) OR (FIND_IN_SET(7, categories_tree))) OR (FIND_IN_SET(39, categories_tree)) ORDER BY `published_at` DESC LIMIT 10

在1.1毫秒

0 个答案:

没有答案