0

以前我使用 cakephp 版本 1.3.1 和模型关联工作正常,但在版本 2.3.2 关联不工作。

我创建了一个名为 Listings 的控制器:

class ListingsController extends AppController {
    var $uses = 'Listing';
    var $name = 'Listings';
    var $components = array();

    function getFeatured(){
        $listing = $this->Listing->read();
        $this->Listing->recursive = 1;
        $today = date('Y-m-d');
        $listings = $this->Listing->find('all', array('conditions'=>'Listing.featured_expiration >='.$today,'order'=>'Rand()'));
        return $listings;
    }

//**** Function For Retreve All Properties Counts **** //
}

在我创建的模型中

class Listing extends AppModel {
    var $name = 'Listing';
    var $displayField = 'full_address';
    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),      
    );    
}

但我没有得到用户表记录。

它在本地运行良好。我也尝试使用可包含的行为,但遇到了同样的问题。

谢谢

4

1 回答 1

0

不是答案,而是一些改进代码的评论。我将此作为答案发布,因为评论允许空间有限;

不要var用于属性

Var 在旧版本的 CakePHP 中用于与 PHP 4 兼容。对于 PHP5,使用publicprotectedprivate显式设置它们的可见性

您发布的代码中的所有属性都应该是public,因此可以更改为;

 public $name = 'Listing';
 public $displayField = 'full_address';
 //etc

删除关系中不必要的选项

在您的示例中,空选项只会添加“混乱”(有时甚至可能会导致不需要的副作用)。删除fields,conditionsorder选项。

更进一步,因为你的模型显然遵循 CakePHP 约定,你根本不需要设置任何选项;这两个都可以正常工作:

public $belongsTo = array(
    'User' => array(),
);

甚至:

public $belongsTo = array('User');

删除未使用的查询

你为什么在里面执行两个查询getFeatured()?第一个查询的结果($listing = $this->Listing->read();)甚至没有使用,可以删除

应在您的模型中执行与数据相关的代码。

该方法getFeatured()确实不属于Controller。更糟糕的是,因为它是一个公共方法,它可以通过浏览器访问!(via http://yourdomain.com/listings/getFeatured/) 如果没有找到视图文件,它可能会显示错误,但方法内的查询将被执行

将该方法移至列表模型。您将不得不进行一些小的修改;

class Listing extends AppModel {
    // rest of the code here 

    public function getFeatured(){
        //Moved this to within the 'find' parameters
        //to only change recursive for *this* find
        //and not influence other queries after running
        //this one
        //$this->recursive = 1;

        return $this->find('all', array(
            'conditions' => array(
                // NOTE: use an associative array here
                'Listing.featured_expiration >=' => date('Y-m-d'),
            ),
            'recursive' => 1,

            // NOTE: check if this really works
            //      Cake *may* treat this as a literal
            //      value (string "Rand()")
            'order' => 'Rand()'
        ));
    }
}

现在,如果您想在控制器中使用它,请使用:

$this->Listing->getFeatured();
于 2013-04-18T22:27:38.437 回答