2015-12-30 4 views
3

Я создаю приложение yii, и я хочу вставить данные в базу данных, но проблема заключается в том, как вставлять дату и время. Он не может вставить каждую деталь, пока я не удалю столбец времени даты из базы данных.Yii2 введите дату и время в sql

Это класс контроллера:

<?php 
namespace app\controllers; 

use amnah\yii2\user\models\User; 
use app\models\Influence; 
use Yii; 
use yii\filters\AccessControl; 
use yii\filters\VerbFilter; 
use amnah\yii2\user\controllers\DefaultController as SuperDefault; 

class DefaultController extends SuperDefault { 

    public function behaviors() 
    { 
     return [ 
      'access' => [ 
       'class' => AccessControl::className(), 
       'rules' => [ 
        [ 
         'actions' => ['index', 'confirm', 'resend', 'logout'], 
         'allow' => true, 
         'roles' => ['?', '@'], 
        ], 
        [ 
         'actions' => ['account', 'profile','contact', 'resend-change', 'cancel','advertiser_dashboard','influencer_dashboard', 'influenza_info', 'advertiser'], 
         'allow' => true, 
         'roles' => ['@'], 
        ], 
        [ 
         'actions' => ['login', 'register','contact','influencer_dashboard', 'advertiser_dashboard','register_advert','forgot', 'reset', 'login-email', 'login-callback'], 
         'allow' => true, 
         'roles' => ['?'], 
        ], 
       ], 
      ], 
      'verbs' => [ 
       'class' => VerbFilter::className(), 
       'actions' => [ 
        'logout' => ['post', 'get'], 
       ], 
      ], 
     ]; 
    } 


    public function actionInfluenza_info() 
    { 
     $u_id = Yii::$app->user->id; 
     $user = User::findOne($u_id); 
      $influence= new Influence(); 

     if ($influence->load(Yii::$app->request->post())) { 

        $influence_data = Yii::$app->request->post('Influence', []); 
       $influence->firstname = $influence_data['firstname']; 
       $influence->lastname = $influence_data['lastname']; 
       $influence->email = $influence_data['email']; 
       $influence->city = $influence_data['city']; 
       $influence->type = $influence_data['type']; 
       $influence->pic = $influence_data['pic']; 
       $influence->address = $influence_data['address']; 
       $influence->country = $influence_data['country']; 
       $influence->gender = $influence_data['gender']; 
        $influence->id = $u_id; 

        $influence->save(); 

      Yii::$app->session->setFlash("Profile-success", Yii::t("user", "Profile updated")); 
      return $this->refresh(); 
     } else { 
      return $this->render('influenza_info', [ 
       'user' => $user, 

        'influence' =>$influence 
      ]); 
     } 

    } 

    } 

это модель класса

<?php 

namespace app\models; 

use Yii; 
use app\controllers\Expression; 
/** 
* This is the model class for table "influence". 
* 
* @property integer $id 
* @property integer $user_id 
* @property string $firstname 
* @property string $lastname 
* @property string $email 
* @property string $city 
* @property string $type 
* @property string $pic 
* @property string $address 
* @property string $country 
* @property string $gender 
*/ 
class Influence extends \yii\db\ActiveRecord 
{ 
    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'influence'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['id', 'user_id', 'firstname', 'lastname', 'email', 'city', 'type', 'pic', 'address', 'country', 'gender'], 'required'], 
      [['id', 'user_id'], 'integer'], 
     [['firstname', 'lastname', 'email', 'city', 'type', 'pic', 'address', 'country', 'gender'], 'string', 'max' => 30] 
     ]; 
    } 
public function beforeSave($insert) 
{ 
if ($this->isNewRecord) { // new record only, otherwise time is inserted every time this record is updated 
    $this->created_at = new Expression('NOW()'); 
} 
parent::afterSave($insert); 
} 
    /** 
    * @inheritdoc 
    */ 
    public function attributeLabels() 
    { 
     return [ 
      'id' => 'ID', 
      'user_id' => 'User ID', 
      'firstname' => 'Firstname', 
      'lastname' => 'Lastname', 
      'email' => 'Email', 
      'city' => 'City', 
      'type' => 'Type', 
      'pic' => 'Pic', 
      'address' => 'Address', 
      'country' => 'Country', 
      'gender' => 'Gender', 
      'created_at' => 'Created_at', 
     ]; 
    } 
} 

таблица SQL

CREATE TABLE `influence` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `firstname` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `lastname` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `email` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `city` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `type` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `pic` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `address` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `country` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `gender` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `created` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ; 

как я сделать это вставить автоматически. если я попробую его у моего администратора, он работает и получает дату и время. но с yii это не так.

ответ

1

Для этого я удаляю созданный атрибут из требуемого правила. Затем я создаю метод beforeSave(), а в новой записи вставляем его в выражение.

public function beforeSave($insert) 
{ 
if ($this->isNewRecord) { // new record only, otherwise time is inserted every time this record is updated 
    $this->created = new Expression('NOW()'); 
} 
parent::beforeSave($insert); 
} 

Убедитесь, что вы импортировать выражение в модели

Update обновленный код благодаря @crafter

+0

@arinze Что такое ошибка? – Jonnny

+0

не ошибка ничего не вставляет, если я не удаляю время colomn в базе данных, я отредактировал мой класс модели в вопросе, посмотрим, как это не я сделал это хорошо – arinze

+0

попробуйте это: 'if (! Model-> save()) print_r ($ model-> getErrors()) 'Это скажет вам, какое правило не работает – Jonnny

0

Вы

`created` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP 

в вас дб таблице, но, кажется, у вас есть модель поле, созданное в виде строки.

* @property string $created 

проверить, если есть несоответствие проблема, связанная с полем тыс и в конечном итоге обеспечить правильное преобразование, прежде чем сохранить или изменить модель (или БД) для того, чтобы иметь один и тот же тип данных ..

В любом случае вы нет правил для $ создан и не POSTED добавить

public function rules() 
{ 
    return [ 
     [['id', 'user_id', 'firstname', 'lastname', 'email', 'city', 'type', 'pic', 'address', 'country', 'gender'], 'required'], 
     [['id', 'user_id'], 'integer'], 
    [['firstname', 'lastname', 'email', 'city', 'type', 'pic', 'address', 'country', 'gender'], 'string', 'max' => 30] 
    [['created',], 'safe'], 

    ]; 
} 

Try также

$influence->save(false); 

таким образом вы сохраните данные withot проверки обнаружится (используются только для отладки), если в этом случае модель сохранена попробовать addding

 [['created'], 'date'], 

в правилах

+0

В PHP нет типа данных даты. (Доступно для чтения) Даты будут существовать как строки в PHP. – crafter

+0

что мне делать – arinze

+0

Я этот вопрос связан с тем фактом, что у вас нет правила или безопасного объявления в правилах модели. У меня есть ответ – scaisEdge

0

Вопрос заключается в том, что вы путаете события beforeSave и afterSave.

Кроме того, имя вашего поля создано, а не создано.

public function beforeSave($insert) 
{ 
    if ($this->isNewRecord) { // new record only, otherwise time is inserted every time this record is updated 
     $this->created = new Expression('NOW()'); // <== You were setting $this->created_at 
    } 
    parent::beforeSave($insert); // <== You were calling afterSave() 
} 
1

Вы должны использовать выражение следующим образом. См. Эту ссылку Class yii\db\Expression

Когда объект Expression встроен в SQL-оператор или фрагмент, он будет заменен значением свойства $ expression без какого-либо экранирования или цитирования БД.Например,

$expression = new Expression('NOW()'); 
$now = (new \yii\db\Query)->select($expression)->scalar(); // SELECT NOW(); 
echo $now; // prints the current date 
Смежные вопросы