2013-02-11 145 views
0

我试图打印包含记录的总列表,对于此列表,有些可能与用户连接。活动项目来自同一班级的另一个集合(活动集合)。我会对整个列表进行foreach,并且需要检查每个记录是否存在于活动集合中。 有没有这个功能?Kohana 3.2 ORM检查集合中是否存在记录

现在我把活动项放在一个数组中,记录ID作为数组键以检查,并且工作正常,但我想知道是否有更好的方法来做到这一点?

$totalcollection = ORM::Factory('table')->find_all(); 
// user has an relation named 'activerecords', which will find the records connected 
// to a user through a link table 
$activecollection = $user->activerecords->find_all(); 


foreach($totalcollection as $record) { 

    $active = false; 

    // I'm looking for a function like this one. Does it exist? 
    $active = $activecollection->contains($record); 

    if($active) { 
     echo "<li class=\"active\">".$record->name."</li>"; 
    } else { 
     echo "<li>".$record->name."</li>"; 
    } 
} 

任何想法?

回答

0

你可以写一个方法,你Model_Table

public function belongs_to_user(Model_User $user) 
{ 
    return ($user->activerecords->where('id', '=', $this->id)->count_all() > 0); 
} 

,然后在循环

foreach($totalcollection as $record) { 

    if($record->belongs_to_user($user)) { 
     echo "<li class=\"active\">".$record->name."</li>"; 
    } else { 
     echo "<li>".$record->name."</li>"; 
    } 
} 

另一种选择,如果你认为这会产生太多的SQL查询,将获取activerecord ID并与in_array()核对,我认为这就是你现在正在做的事情。海事组织也会很好。

顺便说一句:请考虑从你的逻辑分离你的布局,例如与KOstache

+0

感谢您的反馈!我确实希望已经有这样的功能,你的回答会增加很多查询,所以我想我会坚持当前的逻辑。我使用smarty,所​​以布局和逻辑是分开的。但对于这个例子来说,这更简单。不管怎么说,还是要谢谢你! – mrBrown 2013-02-11 14:04:50

0

由于您使用单一的表,你只需要检查从$totalcollection元素的type属性是否等于active,像这样:

$totalcollection = ORM::Factory('table')->find_all(); 

foreach($totalcollection as $record) { 

    if($record->type == 'active') { 
     echo "<li class=\"active\">".$record->name."</li>"; 
    } else { 
     echo "<li>".$record->name."</li>"; 
    } 
} 

将它们作为两个单独集合是没有意义的,并是不必要的开销。

+0

我的歉意,我的示例代码有点穷..我修改它。有一个链接表连接用户和记录,1-n关系。我想查找所有记录,然后检查哪一个连接到用户。现在更清楚了吗? – mrBrown 2013-02-11 12:53:13