我正在使用3个表(property,property_rooms,property_images)。我有一个SQL查询,需要在Yii动作和视图中实现它。
SELECT * FROM property JOIN property_rooms ON property.property_id = property_rooms.property_id JOIN property_images ON property.property_id = property_images.property_id
在控制器/动作中,我使用了以下代码:
$sql ='SELECT * FROM property JOIN property_rooms ON property.property_id = property_rooms.property_id JOIN property_images ON property.property_id = property_images.property_id';
$properties = property::findBySql($sql)->all();
return $this->render('index',['properties'=>$properties]);
在View文件中,我使用了:
<?php foreach ($properties as $property): ?>
<?= $property->property_id ?>
<?= $property->price?>
<?php endforeach; ?>
显示第一个表的值,但访问&amp;显示其他表格的值。
答案 0 :(得分:1)
因为您正在使用
$properties = property::findBySql($sql)->all();
$properties
将包含属性模型。
您可以使用
定义关系(例如propertyRooms)和访问它们<?php foreach ($properties as $property): ?>
<?= $property->property_id ?>
<?= $property->price?>
<?php foreach($property->propertyRooms as $pr) : ?>
<?php /* ... */ ?>
<?php endforeach; ?>
<?php endforeach; ?>
例如,propertyRooms属性可以在属性模型中定义为:
public function getPropertyRooms() { return $this->hasMany(PropertyRoom::className(), ['property_id' => 'property_id']); }
最后,我将使用ActiveDataProvider方法获取属性数据:
$properties = property::find()->with('propertyRooms')->all();
因此,您只需一步即可获得所有属性数据。