Fuelphp Как автоматически заполнять внешний ключ на основе первичного ключа

Вот мой пользовательский контроллер

public function action_create_student(){

    $view = View::forge('admin/users/create_student');

    if (Input::method() == 'POST')
    {   
        $val = Model_User::validate('create');

if ($val->run())
        {
            $newuser = Model_User::forge(array(
                'username'=> Input::post('username'),
                'firstname' =>Input::post('firstname'),
                'middlename'=> Input::post('middlename'),
                'lastname'=> Input::post('lastname'),
                'password'=> Auth::instance()->hash_password(Input::post('password')),
                'phone_number'=> Input::post('phone_number'),
                'group'=> Input::post('group'),
                'email'=> Input::post('email'),
                'course' =>Input::post('course'),
            ));
            $useruser = Model_Student::forge(array(
                'course' =>Input::post('course'),
                'user_id' =>Input::post('user_id'),
            ));
            $useruser->save();
            $newuser->save();

Я хочу добавить пользователя и хочу, чтобы user_id (внешний ключ) был равен id (первичному ключу) в таблице пользователей.

Вот модель моего пользователя

<?php
class Model_User extends \Orm\Model
{

protected static $_properties = array(
    'id',
    'username',
    'password',
    'firstname',
    'middlename',
    'lastname',
    'phone_number',
    'group',
    'email',
    'created_at',
    'updated_at',

);
protected static $_has_one = array(
    'student' => array(
        'model_to' => 'Model_Student',
        'key_from' => 'id',
        'key_to' => 'user_id',
        'cascade_delete' => true,
    ),
);


// public function get_full_name () {
//  return $this->'firstname' . ' ' . $this->'lastname';
//  static::method_exists(object, method_name());
// }
protected static $_observers = array(
    'Orm\Observer_CreatedAt' => array(
        'events' => array('before_insert'),
        'mysql_timestamp' => false,
    ),
    'Orm\Observer_UpdatedAt' => array(
        'events' => array('before_save'),
        'mysql_timestamp' => false,
    ),
);


public static function validate($factory)
{
    $val = Validation::forge($factory);
    $val->add_field('username', 'Username', 'required|max_length[50]');
    $val->add_field('password', 'Password', 'required|max_length[255]');
    $val->add_field('firstname', 'Firstname', 'required|max_length[50]');
    $val->add_field('middlename', 'Middlename', 'required|max_length[255]');
    $val->add_field('lastname', 'Lastname', 'required|max_length[255]');
    $val->add_field('phone_number', 'Phone Number', 'required|valid_string[numeric]');
    $val->add_field('group', 'Group', 'required|valid_string[numeric]');
    $val->add_field('email', 'Email', 'required|valid_email|max_length[255]');
    return $val;
}
}

Вот моя модель студента

class Model_Student extends \Orm\Model
{

protected static $_properties = array(
    'id',
    'course',
    'user_id',
    'created_at',
    'updated_at',
);

/**
 * @var array   belongs_to relationships
 */
protected static $_belongs_to = array(
    'user' => array(
        'model_to' => 'Model_User',
        'key_from' => 'user_id',
        'key_to'   => 'id',
    ),
);


protected static $_observers = array(
    'Orm\Observer_CreatedAt' => array(
        'events' => array('before_insert'),
        'mysql_timestamp' => false,
    ),
    'Orm\Observer_UpdatedAt' => array(
        'events' => array('before_save'),
        'mysql_timestamp' => false,
    ),
);

public static function validate($factory)
{
    $val = Validation::forge($factory);
    $val->add_field('course', 'Course', 'required|max_length[50]');
    $val->add_field('user_id', 'User_id',  'required|valid_string[numeric]');
    return $val;
}
}

Помогите мне избавиться от этого нужна помощь спасибо:)

2 ответа

Теперь я отвечу на мой вопрос:)

  $newuser = Model_User::forge(array(
                'username'=> Input::post('username'),
                'firstname' =>Input::post('firstname'),
                'middlename'=> Input::post('middlename'),
                'lastname'=> Input::post('lastname'),
                'password'=> Auth::instance()->hash_password(Input::post('password')),
                'phone_number'=> Input::post('phone_number'),
                'group'=> Input::post('group'),
                'email'=> Input::post('email'),
                'course' =>Input::post('course'),
            ));
            $newuser->student = Model_Student::forge(array(
                'course' =>Input::post('course'),
            ));

            if($newuser->save()){
                Session::set_flash('success', e('Added user'));
                Response::redirect('admin/users');
            }

Вам просто нужно сохранить поле в ученике, кроме user_id, оно будет автоматически сохранено, когда вы присоединитесь к нему с помощью orm.

В вашем контроллере вы можете просто сделать

$newuser->student = $useruser;
$newuser->save();

вместо

$newuser->save();
$useruser->save();

При условии, что ваши отношения настроены правильно, что, по-видимому, вы делаете, ORM автоматически заполнит ключ для вас при сохранении. Основные примеры кода можно найти в документации: http://fuelphp.com/docs/packages/orm/relations/has_one.html

Другие вопросы по тегам