@yar_stun

Yii2. Как сохранить дату в БД в формате Unix?

Здравствуйте. Есть поле с выбором даты публикации статьи во View:
<div class="date-picker-wrapper">
                        <?= $form->field($model, 'publish_at')->widget(DateTimePicker::class); ?>
                    </div>


5f1ad9540fc34282724245.png

Моя задача сохранить эту дату в бд в формате Unix, пример: 1531136820.
Yii::$app->request->post() эту дату отправляет, но когда создается запись в БД она сохраняется как int с числом 1.
Подскажите. пожалуйста, что я упускаю.
Контроллер:
public function actionCreate()
    {

        $form = new NewsForm();
        if ($form->load(Yii::$app->request->post()) && $form->validate() )
        {

            $news = $this->service->create($form);
            //print ('<pre>');var_dump($news);die();
            addAlert('success', 'Новость добавлена');
            return $this->redirect(['view', 'id' => $news->id]);
        }

        return $this->render('create', [
            'model' => $form,
        ]);
    }

Модель News:
* @property int $id
 * @property integer $created_at
 * @property integer $publish_at
 * @property string $title
 * @property string $short_desc
 * @property string $body
 * @property boolean $is_public
 * @property integer $photo_id
 * @property integer $user_id
 *
 * @property Meta $meta
 * @property Photo $photo
 * @property User $author
 */
class News extends ActiveRecord
{

    public $meta;

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'shop_news';
    }

    public static function create( $title, $short_desc, $body, $publish_at, $is_public, Meta $meta): self
    {
        $news = new static();
        $news->title = $title;
        $news->short_desc = $short_desc;
        $news->meta = $meta;
        $news->body = $body;
        $news->created_at = time();
        $news->publish_at = $publish_at;
        $news->is_public = $is_public;
        $news->user_id = Yii::$app->user->identity->getId();
        return $news;
    }

    public function rules()
    {
        return [
            [['title', 'short_desc', 'body'], 'required'],
            [['title'], 'string', 'max' => 65],
            [['created_at', 'publish_at'], 'safe'],
            //[['publish_at'], 'datetime', 'format' => 'php:d.m.Y H:i', 'timestampAttribute' => 'publish_at'],
            [['short_desc'], 'string', 'max' => 100],
            [['body'], 'string'],
        ];
    }

    public function beforeSave($insert)
    {
        DateTime::createFromFormat('yyyy/mm/dd hh:ii', $this->publish_at)->getTimestamp();
        return parent::beforeSave($insert);
    }

NewsService:
public function create(NewsForm $form): News
    {
        $news = News::create(
            $form->title,
            $form->short_desc,
            $form->body,
            $form->is_public,
            $form->publish_at,
            new Meta(
                $form->meta->title,
                $form->meta->description,
                $form->meta->keywords
            )
        );

Заранее спасибо!
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Если дата приходит в виде 2020-06-12 14:45, то в правилах валидации можно написать так.
['publish_at', 'datetime', 'timestampAttribute' => 'publish_at', 'format' => 'php:Y-m-d H:i'],

На примере валидации формы контактов.
public function contact($email)
    {
        echo $this->publish_at; // 2020-06-12 14:45.
        if ($this->validate()) {
            echo $this->publish_at;  // 1591962300
            exit();
        }
        return false;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jake47
Full-stack Yii2, Vue js
Если в контроллер приходит строка 2020-06-12 14:45, то попробуйте при присвоении обернуть в пхп функцию strtotime как: $this->publish_at = strtotime( $news->publish_at);
Должно сработать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы