Yii2从第一个查询的结果对同一表做第二个查询

时间:2015-11-07 05:58:28

标签: mysql subquery yii2

我正在使用Yii2 Framework。

底线是我问如何在SAME表上查询具有查询结果的表。有一个结构允许您将表的列与查询中的SAME列进行比较。在我的情况下,我需要与不同的列进行比较。

例如:

 <!DOCTYPE html>
<html>
  <head>
    <title>Place searches</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
    </style>
    <script>
var map;
var infowindow;

function initMap() {
  var pyrmont = {lat: -33.867, lng: 151.195};

  map = new google.maps.Map(document.getElementById('map'), {
    center: pyrmont,
    zoom: 15
  });

  infowindow = new google.maps.InfoWindow();

  var service = new google.maps.places.PlacesService(map);
  service.nearbySearch({
    location: pyrmont,
    radius: 500,
    types: ['store']
  }, callback);
}

function callback(results, status) {
  if (status === google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < results.length; i++) {
      createMarker(results[i]);
    }
  }
}

function createMarker(place) {
  var placeLoc = place.geometry.location;
  var marker = new google.maps.Marker({
    map: map,
    position: place.geometry.location
  });

  google.maps.event.addListener(marker, 'click', function() {
    infowindow.setContent(place.name);
    infowindow.open(map, this);
  });
}

    </script>
  </head>
  <body>
    <div id="map"></div>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
  </body>
</html>

默认情况下,将Products表中的所有ChildIds与$ Query1中的ChildId值进行比较。我需要能够将ChildId与不同的$ Query1列值进行比较。

以下是所有细节:

我有一个简单的ID列表,包含3列

$Products = Products::find()->where(['in', 'ChildId', $Query1]);

正如您可能猜到的那样,这些类别将用于拉动适合它们的产品。 每个产品仅分配一个ChildId。 有三个级别的类别。防爆。 column1 = ParentId column2 = childId column3 = Name

服装等顶级类别的ParentId为1。

表:产品类别

Clothing -> Mens Casual -> Mens Athletic Wear

在服装主页上,我想显示所有服装产品:

ParentId     ChildId   Name
1           1      Root
1           2      Clothing
1           3      Jewelry
1           4      Accessories
2           5      Mens Casual
2           6      Womens Casual
5           7      Mens Athlectic Wear

只带回男装休闲装和女装休闲装。 (显然我可以包括,而且ParentId = 5 但重点是我只是试图硬编码网站工作方式的最高级别) 所以下一步是确定$ Query1(5和6)中的ChildIds也是父类(ans.5)然后检索 他们的孩子(ans.7)。然后我可以使用5,6或7的ChildId获取所有产品并完成页面。

理想情况下,我希望运行接下来的三行来实现这一点,但下一行不正确:

//查找那些也是父母的衣服ChildIds(在这种情况下为5和6)(仅限5)

 $Query1 = Productcategories::find()->where('ParentId = 2')->asArray()->all();

问题:$ Query1 [&#39; ChildId&#39;]语法无效。只有$ Query1才能执行,但结果当然是错误的 因为它比较的是ParentIds而不是ChildIds。你知道正确的语法吗?

//现在找到父母的孩子

$AlsoParentsQuery = Productcategories::find()->
    where(['in', 'ParentId', $Query1['ChildId']])->asArray()->all();

如果我可以从上面的步骤中获得正确的$ AlsoParentsQuery,那么这是有效的语法并且有效。

//现在从Query1和$ Query2

中获取带有结果ID的Products
$Query2 = Productcategories::find()->
    where(['in', 'ProductCategoryId',  
          $AlsoParentsQuery])->asArray()->all();

这证明是有效的语法并且有效。

如何获得$ AlsoParentsQuery或同等工作在Yii2?

1 个答案:

答案 0 :(得分:0)

已解决:放弃where(['in',使用数组进行处理并使用对象使用简单的where()语句。

    //SELECT * FROM table WHERE column1 IN (SELECT column2 FROM table WHERE column1 = 8)// This needs to be executed in several steps:
    // Format:
    //$subQuery = YourModel::find()->select('column2')->where(['column1' => 8]);  //(SELECT column2 FROM table WHERE column1 = 8)
    //$mainQuery = YourModel::find()->where(['column1' => $subQuery]);
    //$models = $mainQuery->all();
    // Do subselect first: (SELECT column2 FROM table WHERE column1 = 8). This will give all the 2nd level category records belonging to 1st Level - Clothing
    $subQuery = Productcategories::find()->select('ProductCategoryId')->where(['ParentProductCategoryId' => 8])->andWhere('IsActive = true');// Find records where a level 2 ProductCategoryId is the parent of a level 3
    $mainQuery = Productcategories::find()->where(['ParentProductCategoryId'=>$subQuery])->andWhere('IsActive = true');// Now get all the 3rd level category records 
    $model = $mainQuery->asArray()->all(); // had to ad the asArray() for a pagination count to work
    // Now getting all the products
    $query = Products::find()->with('productmedias')->where(['in', 'ProductCategoryId', $subQuery])->orWhere(['in', 'ProductCategoryId', $model]);