我正在使用 3 个表(属性,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]);
在视图文件中,我使用了:
<?php foreach ($properties as $property): ?>
<?= $property->property_id ?>
<?= $property->price?>
<?php endforeach; ?>
显示第一个表的值,但要访问和显示其他表的值。
既然你正在使用
$properties = property::findBySql($sql)->all();
$properties
将包含属性模型。
您可以定义关系(例如属性房间)并使用
<?php foreach ($properties as $property): ?>
<?= $property->property_id ?>
<?= $property->price?>
<?php foreach($property->propertyRooms as $pr) : ?>
<?php /* ... */ ?>
<?php endforeach; ?>
<?php endforeach; ?>
例如,属性房间属性可以在属性模型中定义为:
public function getPropertyRooms() { return $this->hasMany(PropertyRoom::className(), ['property_id' => 'property_id']); }
最后,我将使用 ActiveDataProvider 方法来获取属性数据:
$properties = property::find()->with('propertyRooms')->all();
因此,您将在一个步骤中获得所有属性数据。