多个连接在Yii2中的条件中表现不同

时间:2015-11-10 05:15:11

标签: php sql yii2 yii2-advanced-app

$materials = Material::find()
    ->where(['in', 'Material.MaterialId', $value])
    ->joinWith(['objectName'])
    ->all();

$product = Product::find()
    ->where(['Product.productId' => $id, 'Product.ModelId' => $mid])
    ->joinWith(['product' => function ($query) {
        $query->joinWith([
            'objectName',
            'contents' => function ($query2) {
                $query2->joinWith(['material' => function ($query3) {
                    $query3->where(['in', 'Material.MaterialId', $value])
                        ->joinWith(['objectName']);
                }]);
            },
        ])
        ->all();
    }])
    ->one();

我遇到了一个错误。 $query3给出一个错误,IN期望两个操作数,而如果我提供相同的材料模型,它工作正常但在产品模型中它不起作用。

此外,我想将产品添加到购物车产品及其插件中(我将它们称为材料对象)。如果我将$query3重写为

$query3->where(['in','Material.MaterialId', ['ID1', 'ID2']])->joinWith(['objectName']);

它的运作方式应该如此。另外,如果我使用ArrayHelper::toArray($value)它会返回null,可能因为$value数组现在是子数组。我确信$value是数组。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

变量$value在引用它的闭包范围内不存在。每个闭包都是一个范围,只能使用全局变量或来自其父范围的变量。因此$value必须由每个闭包连续继承,闭包是它所使用的闭包的父对象。这可以通过use完成:

$product = Product::find()
    ->where(['Product.productId' => $id, 'Product.ModelId' => $mid])
    ->joinWith(['product' => function ($query) use ($value) {
        $query->joinWith([
            'objectName',
            'contents' => function ($query2) use ($value) {
                $query2->joinWith(['material' => function ($query3) use ($value) {

同样适用于$query2$query3