0

通过 orm 将复选框值添加到 db 时遇到问题

适用于普通字段,但如果在允许多个选项的复选框问题上选择了多个复选框,则不会

这是表格位

<?php echo Form::label('first_name', 'First Name')?><br />
<?php echo Form::input('first_name', $profile->first_name, array('class'=>'inputbox')); ?><br />


<?php echo Form::label('last_name', 'Last Name')?><br />
<?php echo Form::input('last_name', $profile->last_name, array('class'=>'inputbox')); ?><br />

Favorite Genres: 
<label><input type="checkbox" value="Horror"  name="genres[]"  />
<strong>Horror</strong></label><br />
<label><input type="checkbox" value="Thriller"  name="genres[]"  />
<strong>Thriller</strong></label><br />

这是控制器位

if ($_POST) {
    if ($profile->values($_POST)->check()) {
        $profile->user_id = $user;
        $profile->save();
    }
}

这是模型位

protected $_rules = array(

'first_name' => array(
    'not_empty' => NULL,

),

'last_name' => array(
    'not_empty' => NULL,

),


);

仅在选择多个复选框时不工作,我会得到此错误

Database_Exception [1241]:操作数应包含 1 列

不确定最好的方法。我应该序列化还是内爆?在哪里做这个?

我想在将来构建基本搜索表单以使用此列搜索“喜欢”值。

4

2 回答 2

1

这是一个DB例外,而不是Validation. 对于这种情况,您应该使用 ORM 关系:

class Model_Profile extends ORM {

   protected $_has_many = array(
       // profile has and belongs to many genres
       'genres'  => array(
            'through' => 'profiles_genres', // pivot table name
       ),
   );
}

然后更改当前配置文件的流派,如下所示:

try 
{
   $profile->check();
   $profile->save();
   // now replace old genres with a new list
   // clear genres
   $profile->remove('genres');
   foreach($this->request->post('genres') as $genre) 
   {
       $genre = ORM::factory('genre')->where('name', '=', $genre);
       if ($genre->loaded()) 
       {
           $profile->add('genres', $genre);
       }
   }
}
catch (Validate_Exception) 
{
    // wrong input
}

注意不是genres分隔表,不是profiles列。您还需要一个profiles_genres带有profile_idgenre_id列的数据透视表。

于 2012-06-14T11:00:48.607 回答
0

您应该创建一个流派表和模型,并为流派和配置文件创建一个数据透视表:

CREATE TABLE IF NOT EXISTS `genres` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniq_name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `genres_profiles` (
  `profile_id` int(10) UNSIGNED NOT NULL,
  `genre_id` int(10) UNSIGNED NOT NULL,
  PRIMARY KEY  (`profile_id`,`genre_id`),
  KEY `fk_genre_id` (`genre_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

请注意,您不需要为数据透视表创建 ORM 模型。
您可以在官方文档中找到更多信息

于 2012-06-14T11:04:53.673 回答