我正在使用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?
答案 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]);