Specialization.php 5.33 KB
<?php

    namespace common\models;

    use Yii;
    use yii\db\ActiveQuery;
    use yii\helpers\ArrayHelper;

    /**
     * This is the model class for table "specialization".
     * @property integer $specialization_id
     * @property integer $specialization_pid
     * @property string  $specialization_name
     * @property string  $image
     * @property string  $background
     */
    class Specialization extends \yii\db\ActiveRecord
    {

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

        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [
                    [
                        'specialization_pid',
                        'status',
                    ],
                    'integer',
                ],
                [
                    [ 'specialization_pid' ],
                    'default',
                    'value' => '0',
                ],
                [
                    [ 'specialization_name' ],
                    'required',
                ],
                [
                    [
                        'specialization_name',
                        'image',
                        'background',
                    ],
                    'string',
                    'max' => 255,
                ],
            ];
        }

        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'specialization_id'          => Yii::t('app', 'specialization_id'),
                'specialization_pid'         => Yii::t('app', 'specialization_pid'),
                'specialization_name'        => Yii::t('app', 'specialization_name'),
                'specialization_parent_name' => Yii::t('app', 'specialization_parent_name'),
                'image'                      => Yii::t('app', 'image'),
                'background'                 => Yii::t('app', 'background'),
                'status'                     => Yii::t('app', 'status'),
            ];
        }

        public static function specializationsList()
        {

            $specializationArray = [ ];

            $specialization = Specialization::find()
                                            ->where([
                                                'specialization_id' => Specialization::find()
                                                                                     ->select('specialization_id')
                                                                                     ->andWhere('specialization_pid != 0')
                                                                                     ->column(),
                                            ])
                                            ->all();

            foreach(ArrayHelper::index($specialization, 'specialization_id') as $spec) {
                $array = $spec->hasChildrenInArray($specialization);
                if($array) {
                    $specializationArray[ $spec->specialization_name ] = $array;
                }
            }

            return $specializationArray;

        }

        public function getParent()
        {
            return $this->hasOne(self::className(), [ 'specialization_id' => 'specialization_pid' ]);
        }

        public function getChildren()
        {
            return $this->hasMany(self::className(), [ 'specialization_pid' => 'specialization_id' ]);
        }

        public function hasChildrenInArray($array)
        {
            $array = ArrayHelper::map($array, 'specialization_id', 'specialization_name', 'specialization_pid');

            if(isset( $array[ $this->specialization_id ] )) {
                return $array[ $this->specialization_id ];
            } else {
                return false;
            }

        }

        public function getStack()
        {
            $stack[] = $this->specialization_id;
            if(!empty( $this->children )) {
                foreach($this->children as $child) {
                    $stack[] = $child->specialization_id;
                    if(!empty( $child->children )) {
                        $stack = array_merge($stack, ArrayHelper::getColumn($child->children, 'specialization_id', false));
                    }
                }
            }
            return $stack;
        }

        /**
         * @return ActiveQuery
         */
        public static function getSorted()
        {
            return self::find()
                       ->with([
                           'children' => function($query) {
                               /**
                                * @var ActiveQuery $query
                                */
                               $query->orderBy('specialization_name');
                           },
                       ])
                       ->with([
                           'children.children' => function($query) {
                               /**
                                * @var ActiveQuery $query
                                */
                               $query->orderBy('specialization_name');
                           },
                       ])
                       ->where([ 'specialization_pid' => 0 ])
                       ->orderBy('specialization_name');
        }

    }