我有一个巨大的ID列表,我需要通过表查询,以查找表中是否有这些ID,如果是获取其模型.
由于我使用CActiveRecord :: find()方法,因此成千上万的ID这个过程非常慢
恩. $book = Book :: model() – > find(‘book_id =:book_id’,array(‘:book_id’=> $product-> book_id));
我甚至索引了所有可能的密钥,仍然没有改进.
有什么建议可以提高执行速度吗?
提前致谢 :)
解决方法:
1)
列出书籍ID
foreach $product in Product-List
$book_ids[$product->book_id] = $product->book_id;
现在查询所有Book模型(由book_id索引)
$books = Book::model()->findAll(array(
'index' => 'book_id',
'condition' => 'book_id IN (' . implode(',', $book_ids). ')',
));
在您的代码中集成$books,我相信您正在遍历所有产品.
foreach $product in Product-List
if( isset($books[$product->book_id]) )
$model = $books[$product->book_id]
2)另一种方式(我假设你有产品型号)
在产品模型中添加与Book的关系
public function relations() {
.......
'book'=>array(self::HAS_ONE, 'Book', 'book_id'),
.......
}
在检索产品列表时,添加’with’=>数组(‘book’)条件,使用任何CActiveDataProvider或CActiveRecord …
//Example
$productList = Product::model()->findAll(array(
'with' => array('book'),
));
foreach( $productList as $product ) {
.......
if( $product->book != null )
$model = $product->book;
......
}
无论哪种方式,您都可以减少SQL查询.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。