[英]Yii2 Active Record using FIND_IN_SET in where clause
产品表结构和数据-
id,product_name,hsn,product_category,product_subcategory,company,pic,part_no,min_stock,库存,费率,注释
product_subcategory列包含例如的值。
13,14,31,138
18
126,140,176,177
78,79
上面的数字是下表的ID
product_subcategory
-ID,subcategory_name
创建发票时,我需要按product_category, product_subcategory, company
的组合来搜索产品。
为此,我有如下的ajax
<?php
$script2 = <<< JS
$(document).ready(function () {
$(document.body).on('change', '#purchaseitems-0-category_id, #purchaseitems-0-model_id, #purchaseitems-0-company_id', function () {
var tt = $("#purchaseitems-0-category_id").val();
var tt2 = $("#purchaseitems-0-model_id").val();
var tt3 = $("#purchaseitems-0-company_id").val();
var stuff1 ={'key1': tt ,'key2': tt2, 'key3': tt3};
p1();
});
});
function p1() {
var stuff ={'key1':$("#purchaseitems-0-category_id").val(),'key2':$("#purchaseitems-0-model_id").val(), 'key3': $("#purchaseitems-0-company_id").val()};
$.ajax({
type: "POST",
url: "http://localhost/yii-application/backend/web/index.php?r=purchase/p1",
data: {result:JSON.stringify(stuff)},
success: function (test4) {
var json_obj5 = $.parseJSON(test4);
$('#purchaseitems-0-name_of_product').val(json_obj5.id);
$('#purchaseitems-0-hsn').val(json_obj5.hsn);
$('#purchase-taxrate').val(json_obj5.rate);
$('#purchaseitems-0-part').val(json_obj5.part_no);
},
error: function (exception) {
alert(exception);
}
});
}
JS;
$this->registerJs($script2);
?>
现在需要更改的真实代码-
public function actionP1()
{
$data2 = Yii::$app->request->post('result');
$data = $_POST["result"];
$data = json_decode("$data", true);
if (isset($data)) {
$test = $data;
$modelfedbkshiprate = \backend\models\Product::find()->where(['product_category' => $data["key1"]])->andWhere(['like' , 'product_subcategory' , $data["key2"]])->andWhere(['company' => $data["key3"]])->one();
} else {
$test = "Ajax failed";
}
return \yii\helpers\Json::encode($modelfedbkshiprate);
}
上面查询的问题是product_subcategory
的like
运算符。 like
运算符搜索id 7
而不是78
,因此我最终得到了错误的产品。 我想到使用FIND_IN_SET
但不知道如何使用。
请为like
运营商建议一个替代解决方案。
据我了解,您需要使用FIND_IN_SET
来实现此目的,据我FIND_IN_SET
,您在product_subcategory
字段中具有逗号分隔的值,并且您想要获取具有特定ID的行,该行通过表单传递给SQL
查询。
因此,您需要在where
子句中使用\\yii\\db\\Expression
where
如下所示。
\backend\models\Product::find()
->where(['product_category' => $data["key1"]])
->andWhere(new \yii\db\Expression('FIND_IN_SET(:cat_to_find,product_subcategory)'))
->andWhere(['company' => $data["key3"]])
->addParams([':cat_to_find' => $data["key2"]])
->one();
您的动作应如下所示
public function actionP1()
{
$data2 = Yii::$app->request->post('result');
$data = $_POST["result"];
$data = json_decode("$data", true);
if (isset($data)) {
$test = $data;
$modelfedbkshiprate = \backend\models\Product::find()->where(['product_category' => $data["key1"]])->andWhere(new \yii\db\Expression('FIND_IN_SET(:cat_to_find,product_subcategory)'))->andWhere(['company' => $data["key3"]])->addParams([':cat_to_find' => $data["key2"]])->one();
} else {
$test = "Ajax failed";
}
return \yii\helpers\Json::encode($modelfedbkshiprate);
}
遵循此(Find_In_SET)对我有用。
Categories::find()->where(new Expression('FIND_IN_SET(:category_to_find, categories)'))->addParams([':category_to_find' => 3])->asArray()->all();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.