English 中文(简体)
复杂的发现问题 PHP1.3的许多关系
原标题:Complex find query for hasMany relationship in cakePHP 1.3

几个月来,我一直忙于PH的PHP框架,我确实热爱这一框架。 此时,我就开展了一个非常新的项目,它的工作就像它应该做的那样(我认为......),但我感到不舒服的是我写的一些法典。 事实上,我应该优化我的原始条件,以便我立即获得正确的结果(现在我操纵了一套一套一套办法的星座确定的结果:即敲碎打。

我勾画了申请的相关方面。 我有一个模式站点,与示范站点Meta有管理关系。 上表如下所示:id,site_id, key, Value, 创造。

在最后一种模式中,我在不同时期记录了该网站的若干价值。 我想要储存的关键名称(如弹性体、角逐页......),当然还有价值。 在一定间隔期间,我可以评估这一数据库的更新情况,以便我能够跟踪这些价值观的演变情况。

现在我的问题是这个问题。

各个网站的总页(控制器=>站点,行动=>指数) 我愿在网站的网页上播放。 因此,我需要一个确切的SpotMeta记录,即所创造的领域是最高的,关键值应与页数相匹配。 我曾尝试过我所阅读的几件内容,但没有一件工作(可控制、约束性等)。 也许我会做一些错误的事情。

现在,当我花一美元,就象这样取得了成果。

Array
(
    [0] => Array
        (
            [Site] => Array
                (
                    [id] => 1
                    [parent_id] => 0
                    [title] => test
                    [url] => http://www.test.com
                    [slug] => www_test_com
                    [keywords] => cpc,seo
                    [language_id] => 1
                )
            [SiteMeta] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [site_id] => 1
                            [key] => pagerank
                            [value] => 5
                            [created] => 2010-08-03 00:00:00
                        )

                    [1] => Array
                        (
                            [id] => 2
                            [site_id] => 1
                            [key] => pagerank
                            [value] => 2
                            [created] => 2010-08-17 00:00:00
                        )

                    [2] => Array
                        (
                            [id] => 5
                            [site_id] => 1
                            [key] => alexa
                            [value] => 1900000
                            [created] => 2010-08-10 17:39:06
                        )
                )
        )

仅通过所有地点进入第一页,并操纵这个阵列。 下一步 我用《一套办法》过滤结果:摘录。 但是,这并不意味着:

$sitesToCheck = $this->paginate($this->_searchConditions($this->params));

foreach($sitesToCheck as $site) {
            $pagerank = $this->_getPageRank($site[ Site ]);
            $alexa = $this->_getAlexa($site[ Site ]);
            $site[ Site ][ pagerank ] = $pagerank;
            $sites[] = $site;
        }

if (isset($this->params[ named ][ gpr ]) && $this->params[ named ][ gpr ]) {
                $rank = explode( - , $this->params[ named ][ gpr ]);
                        $min = $rank[0];$max = $rank[1];
                $sites = Set::extract( /Site[pagerank<=  . $max .  ][pagerank>=  . $min . ] , $sites);
        }

$this->set(compact( sites ,  direction ));          

请帮助我思考如何解决这一问题? 提前感谢。


感谢捐款。 我尝试了这些选择(也是有约束性的,但没有工作),但是仍然能够照样工作。 如果我这样说的话,

$this->paginate = array(
                     joins =>   array(
                                array(
                                     table => site_metas ,
                                     alias => SiteMeta ,
                                     type  => inner ,
                                     conditions  =>array( Site.id = SiteMeta.site_id )  
                                    )                                                   
                        ),                                                                
        );

I get duplicate results I have a site with 3 different SiteMeta records and a site with 2 different record. The paginate method returns me 5 records in total. There s probably an easy solution for this, but I can t figure it out :)

我也试图自己写一个 s子,但似乎我无法在该案中使用想象力。 下面是我喜欢用想象力的选择和条件。 我完全要问答。

$sites = $this->Site->query( SELECT * FROM sites Site, site_metas SiteMeta WHERE SiteMeta.id = (select SiteMeta.id from site_metas SiteMeta WHERE Site.id = SiteMeta.site_id AND SiteMeta.key =  pagerank  order by created desc limit 0,1 ) );
最佳回答

当你试图在单人关系中检索数据时,cakephp没有违约地加入表格。 请上<条码>。 你可以做这样的事情:

$this->paginate = array(
                    joins =>array(
                              array(
                                table => accounts ,
                                alias => Account ,
                                type  => inner ,
                                conditions  =>array( User.id = Account.user_id )
                              )
                            ),
                             conditions => array( OR  => 
                               array(
                                 Account.name =>$this->params[ named ][ nickname ],
                                 User.id  => 5)
                               )
                            );
$users = $this->paginate();
         $this->set( users ,$users);
debug($users);
$this->render( /users/index );

当然,你必须满足你们的需要。 More关于加入的问题,正如在另一处答复中已经提到的那样。

<><><>>>>> 这是因为你没有第二个条件。 见我的法典。 第一个条件只是说明加入的情况,而第二个条件则是实际选择。

<Edit2:http://book.cakephp.org/view/1017/Retrieving-Your-Data#Complex-Find- Conditionss-1030” rel=“nofollow noreferer”>Here, 部分内容是关于如何撰写条件以便选择所需数据。 您不妨在精细条件下使用<代码>created<>/code>栏上的您专栏的<条码>功能。

<><><><>>> 不能共同使用可捕捉和加入的物品。 摘自手册: 如果你的主要目标是根据相关数据进行搜查,则使用合并法作为可维持的替代办法。 可持续能力最适于限制由查询表提出的相关数据。 我认为,你尚未尝试我的第2号大厦。

<>4>: 一种可能的解决办法是,在表格<代码>Sites上添加一个领域last_updated 。 然后可以在第二次条件说明中使用这个领域与<代码>进行比较。 SiteMeta.created Value.

问题回答

类似情况:

   $this->paginate = array(
         fields =>array(
             Site.* ,
             SiteMeta.* ,
             MAX(SiteMeta.created) as last_date 
         ),
         group  =>  SiteMeta.key 
         conditions  => array(
             SiteMeta.key  =>  pagerank 
        )
    );
    $data = $this->paginate( Site );

或者:

   $conditions = array(
         recursive  => 1,
         fields =>array(
             Site.* ,
             SiteMeta.* ,
             MAX(SiteMeta.created) as last_date 
         ),
         group  =>  SiteMeta.key 
         conditions  => array(
             SiteMeta.key  =>  pagerank 
        )
    );
    $data = $this->Site->find( all , $conditions);

如果做不到以下检查:this ? 我确信,可以找到你想要的单一问题。

类似情况(在你的模型上可以包含):

$this->Site->recursive = -1;

$this->paginate = array(
     conditions  => array(
         Site.title  =>  title ) //or whatever conditions you want... if any
     contain  => array(
         SiteMeta  => array(
              conditions  => array(
                  SiteMeta.key  =>  pagerank ),
              limit  => 1,
              order  =>  SiteMeta.created DESC )));

我使用如此多的含蓄,因此我实际上在我的“模拟档案”中这样做,这样它适用于所有模式:

var $actsAs = array( Containable );

Many thinks to all who managed to help me through this :) I got it fixed after all hehe.

最后,这是对我来说的骗局。

$this->paginate = array(
                     joins =>   array(
                                     array(
                                          table => site_metas ,
                                          alias => SiteMeta ,
                                          type  => inner ,
                                          conditions  => array( Site.id = SiteMeta.site_id ))                                                                       
                                ), 
                     group  =>  Site.id ,
                     contain  => array(
                         SiteMeta  => array(
                                 conditions  => array(
                                     SiteMeta.key  =>  pagerank ),
                                     limit  => 1,
                                     order  => SiteMeta.created DESC ,
                                    )));

        $sites = $this->paginate();




相关问题
PHP Framework: Ebay Like Site

I am going to be builiding a site like ebay - with all the features of ebay. Please note my payment method is limited to paypal. What would be the best PHP framework to use to build this quickly, ...

specifying date format when using $form->inputs() in CakePHP

I am wondering if there is a way to specify the date format in the forms created using CakePHP s $form->inputs(); Please note that this is not the individual $form->input() but instead $form->inputs() ...

Using DISTINCT in a CakePHP find function

I am writing a CakePHP 1.2 app. I have a list of people that I want the user to be able to filter on different fields. For each filterable field, I have a drop down list. Choose the filter ...

Assistance with CakePHP model relationships

How would I represent the following in a CakePHP model? Product ======= product_id .... Cart ==== cart_id .... Carts_Products ============== cart_id product_id quantity

Prevent controller from trying to autoload model

I am a beginning Cake user and trying to do some work on an already existing application. Running into a problem when I create a new controller. I have created StoreController and when I try to call ...

热门标签