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_genresprofile_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 に答える