Yii2使用原生查询find_in_set
时间: 2023-07-06 13:07:47 浏览: 63
在 Yii2 中,可以使用 `find()` 方法和 `where()` 方法来进行原生查询。具体操作如下:
```php
$query = \app\models\YourModel::find()
->where("FIND_IN_SET('value', column_name)"); //将value替换为你要查找的值,column_name替换为你要查询的列名
$results = $query->all(); //获取查询结果
```
在 `where()` 方法中,使用 `FIND_IN_SET()` 函数进行查找,将要查找的值作为第一个参数,要查询的列名作为第二个参数即可。
注意:`find()` 方法返回一个 `yii\db\ActiveQuery` 对象,需要使用 `all()`、`one()`、`count()` 等方法获取查询结果。
相关问题
yii2 when find_in_set then else end 排序
可以使用 `orderBy` 方法实现 `FIND_IN_SET` 函数的排序。
例如,假设你有一个 `items` 表,其中有一个 `tags` 字段,它包含了以逗号分隔的标签列表。如果你想按照标签匹配度对查询结果进行排序,可以使用以下代码:
```php
$query = \app\models\Items::find()
->select(['*', 'FIND_IN_SET("tag1", tags) AS tag1_match'])
->orderBy(['tag1_match' => SORT_DESC]);
```
这里的 `FIND_IN_SET("tag1", tags)` 用来计算 `tag1` 在 `tags` 字段中的位置,如果没有匹配到则返回 0。`tag1_match` 字段则用来保存计算结果,我们通过 `orderBy` 方法将结果按照 `tag1_match` 字段进行倒序排序。
你可以将 `tag1` 替换为你所需要匹配的标签。如果需要同时匹配多个标签,可以将它们用逗号分隔,并使用 `SUM` 函数计算它们在 `tags` 字段中的位置之和。例如:
```php
$query = \app\models\Items::find()
->select(['*', 'SUM(FIND_IN_SET("tag1", tags), FIND_IN_SET("tag2", tags)) AS tags_match'])
->orderBy(['tags_match' => SORT_DESC]);
```
这里的 `SUM(FIND_IN_SET("tag1", tags), FIND_IN_SET("tag2", tags))` 用来计算 `tag1` 和 `tag2` 在 `tags` 字段中的位置之和。注意,这里使用的是逗号分隔,而不是竖线分隔。
yii2 case find_in_set when 1 else 0 end 排序
在 Yii2 中使用 `find_in_set` 函数进行排序可以使用以下代码:
```php
$query = MyModel::find()
->orderBy([
"find_in_set($value, column_name) DESC",
"other_column_name ASC",
]);
```
其中,`$value` 是需要查找的值,`column_name` 是需要在其中查找 `$value` 的字段名。`find_in_set` 函数会返回 `$value` 在 `column_name` 中的位置,如果不存在则返回 0。因此,我们可以使用 `find_in_set` 函数进行倒序排序,这样在 `column_name` 中存在 `$value` 的记录会排在前面。
如果需要在 `$value` 不存在于 `column_name` 中的记录中,将这些记录排在前面,可以使用 `when` 函数进行判断,代码如下:
```php
$query = MyModel::find()
->orderBy([
"(case when find_in_set($value, column_name) then 1 else 0 end) DESC",
"other_column_name ASC",
]);
```
这样,`find_in_set` 函数返回 0 的记录会被当作 `false`,返回非 0 的记录会被当作 `true`。通过 `when` 函数进行判断,如果返回 `true`,则会按照逆序排序,否则按照正序排序。