删除具有'has_many'关系的子条目,1:多关系

时间:2012-05-22 04:17:23

标签: php kohana kohana-3

基于http://kohanaframework.org/3.2/guide/orm/relationships

假设我有2个型号; 1个用户:很多帖子关系。如何删除所选用户的所有帖子?

Model_User

    protected $_has_many = array('posts' => array());

Model_Post

protected $_belongs_to = array(
    'user' => array(
        'foreign_key' => 'author_id',
    ),
);

我尝试了$user->posts->delete(),但它不起作用。

修改

只想添加remove()实际上不适用于此情况,只能用于has_many 'through'关系。

 * @param  string $alias    Alias of the has_many "through" relationship
 * @param  mixed  $far_keys Related model, primary key, or an array of primary keys
 * @return ORM
 */
public function remove($alias, $far_keys = NULL)

ORM /类/ Kohana的/ orm.php

3 个答案:

答案 0 :(得分:1)

您可以尝试$user->remove('posts');

答案 1 :(得分:0)

嗯,我发现这曾经有用。不再是Kohana 3.2 ...

ORM::factory('posts')->where('user_id','=','1')->delete_all();

这是我能用到ORM的最接近的地方。

我决定将自己的delete_all添加到Model_Post中。所以我可以这样做ORM::factory('posts')->delete_all($user_id)

public function delete_all($author_id){
    DB::delete('posts')
        ->where('author_id','=',$author_id)
        ->execute();
}

答案 2 :(得分:0)

我刚刚遇到了与删除函数相同的问题,它只是没有与_has_many关系一起使用,仅用于has_many通过,但它可以很容易修复,我扩展了ORM模型并使用了以下函数代替:

public function remove($alias, $far_keys = NULL)
{
   $far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

   if(NULL !== $this->_has_many[$alias]['through'])
   {
      $table_name = $this->_has_many[$alias]['through'];
   }
   else
   {
      $table_name = ORM::factory($this->_has_many[$alias]['model'])->table_name();
   }

   $query = DB::delete($table_name)
              ->where($this->_has_many[$alias]['foreign_key'], '=', $this->pk());

   if ($far_keys !== NULL)
   {
      // Remove all the relationships in the array
      $query->where($this->_has_many[$alias]['far_key'], 'IN', (array) $far_keys);
   }

   $query->execute($this->_db);

   return $this;
}