src/Common/Model/Base.php
protected function addExpandableField(array $aOptions)
    {
        //  Validation
        if (!array_key_exists('trigger', $aOptions)) {
            throw new ModelException('Expandable fields must define a "trigger".');
        }

        if (!array_key_exists('type', $aOptions)) {
            $aOptions['type'] = static::EXPANDABLE_TYPE_SINGLE;
        }

        if ($aOptions['type'] == static::EXPANDABLE_TYPE_SINGLE && !empty($aOptions['auto_save'])) {
            throw new ModelException(
                'Auto saving an expandable field is incompatible with type static::EXPANDABLE_TYPE_SINGLE'
            );
        } elseif ($aOptions['type'] == static::EXPANDABLE_TYPE_MANY) {
            $bAutoSave = array_key_exists('auto_save', $aOptions) ? !empty($aOptions['auto_save']) : true;
        } else {
            $bAutoSave = false;
        }

        if (!array_key_exists('model', $aOptions)) {
            throw new ModelException('Expandable fields must define a "model".');
        }

        if (!array_key_exists('id_column', $aOptions)) {
            throw new ModelException('Expandable fields must define a "id_column".');
        }

        //  Optional elements
        if (!array_key_exists('property', $aOptions)) {
            $aOptions['property'] = $aOptions['trigger'];
        }

        if (!array_key_exists('provider', $aOptions)) {
            $aOptions['provider'] = 'app';
        }

        $this->aExpandableFields[] = (object) [

            //  The text which triggers this expansion, passed in via $aData['expand']
            'trigger'     => $aOptions['trigger'],

            //  The type of expansion: single or many
            //  This must be one of static::EXPAND_TYPE_SINGLE or static::EXPAND_TYPE_MANY
            'type'        => $aOptions['type'],

            //  What property to assign the results of the expansion to
            'property'    => $aOptions['property'],

            //  Which model to use for the expansion
            'model'       => $aOptions['model'],

            //  The provider of the model
            'provider'    => $aOptions['provider'],

            //  Any data to pass to the getAll (every time)
            'data'        => ArrayHelper::getFromArray('data', $aOptions, []),

            /**
             * The ID column to use; for EXPANDABLE_TYPE_SINGLE this is property of the
             * parent object which contains the ID, for EXPANDABLE_TYPE_MANY, this is the
             * property of the child object which contains the parent's ID.
             */
            'id_column'   => $aOptions['id_column'],

            //  Whether the field is expanded by default
            'auto_expand' => ArrayHelper::getFromArray('auto_expand', $aOptions, false),

            //  Whether to automatically save expanded objects when the trigger is
            //  passed as a key to the create or update methods
            'auto_save'   => $bAutoSave,
        ];

        return $this;
    }
protected function addExpandableField(array $aOptions)
    {
        //  Validation
        if (!array_key_exists('trigger', $aOptions)) {
            throw new ModelException('Expandable fields must define a "trigger".');
        }

        if (!array_key_exists('type', $aOptions)) {
            $aOptions['type'] = static::EXPANDABLE_TYPE_SINGLE;
        }

        if ($aOptions['type'] == static::EXPANDABLE_TYPE_SINGLE && !empty($aOptions['auto_save'])) {
            throw new ModelException(
                'Auto saving an expandable field is incompatible with type static::EXPANDABLE_TYPE_SINGLE'
            );
        } elseif ($aOptions['type'] == static::EXPANDABLE_TYPE_MANY) {
            $bAutoSave = array_key_exists('auto_save', $aOptions) ? !empty($aOptions['auto_save']) : true;
        } else {
            $bAutoSave = false;
        }

        if (!array_key_exists('model', $aOptions)) {
            throw new ModelException('Expandable fields must define a "model".');
        }

        if (!array_key_exists('id_column', $aOptions)) {
            throw new ModelException('Expandable fields must define a "id_column".');
        }

        //  Optional elements
        if (!array_key_exists('property', $aOptions)) {
            $aOptions['property'] = $aOptions['trigger'];
        }

        if (!array_key_exists('provider', $aOptions)) {
            $aOptions['provider'] = 'app';
        }

        $this->aExpandableFields[] = (object) [

            //  The text which triggers this expansion, passed in via $aData['expand']
            'trigger'     => $aOptions['trigger'],

            //  The type of expansion: single or many
            //  This must be one of static::EXPAND_TYPE_SINGLE or static::EXPAND_TYPE_MANY
            'type'        => $aOptions['type'],

            //  What property to assign the results of the expansion to
            'property'    => $aOptions['property'],

            //  Which model to use for the expansion
            'model'       => $aOptions['model'],

            //  The provider of the model
            'provider'    => $aOptions['provider'],

            //  Any data to pass to the getAll (every time)
            'data'        => ArrayHelper::getFromArray('data', $aOptions, []),

            /**
             * The ID column to use; for EXPANDABLE_TYPE_SINGLE this is property of the
             * parent object which contains the ID, for EXPANDABLE_TYPE_MANY, this is the
             * property of the child object which contains the parent's ID.
             */
            'id_column'   => $aOptions['id_column'],

            //  Whether the field is expanded by default
            'auto_expand' => ArrayHelper::getFromArray('auto_expand', $aOptions, false),

            //  Whether to automatically save expanded objects when the trigger is
            //  passed as a key to the create or update methods
            'auto_save'   => $bAutoSave,
        ];

        return $this;
    }
protected function addExpandableField ( array $ aOptions ) { //  Validation if ( ! array_key_exists ( 'trigger' , $ aOptions ) ) { throw new ModelException ( 'Expandable fields must define a "trigger".' ) ; } if ( ! array_key_exists ( 'type' , $ aOptions ) ) { $ aOptions [ 'type' ] = static :: EXPANDABLE_TYPE_SINGLE ; } if ( $ aOptions [ 'type' ] == static :: EXPANDABLE_TYPE_SINGLE && ! empty ( $ aOptions [ 'auto_save' ] ) ) { throw new ModelException ( 'Auto saving an expandable field is incompatible with type static::EXPANDABLE_TYPE_SINGLE' ) ; } elseif ( $ aOptions [ 'type' ] == static :: EXPANDABLE_TYPE_MANY ) { $ bAutoSave = array_key_exists ( 'auto_save' , $ aOptions ) ? ! empty ( $ aOptions [ 'auto_save' ] ) : true ; } else { $ bAutoSave = false ; } if ( ! array_key_exists ( 'model' , $ aOptions ) ) { throw new ModelException ( 'Expandable fields must define a "model".' ) ; } if ( ! array_key_exists ( 'id_column' , $ aOptions ) ) { throw new ModelException ( 'Expandable fields must define a "id_column".' ) ; } //  Optional elements if ( ! array_key_exists ( 'property' , $ aOptions ) ) { $ aOptions [ 'property' ] = $ aOptions [ 'trigger' ] ; } if ( ! array_key_exists ( 'provider' , $ aOptions ) ) { $ aOptions [ 'provider' ] = 'app' ; } $ this -> aExpandableFields [ ] = ( object ) [ //  The text which triggers this expansion, passed in via $aData['expand'] 'trigger' => $ aOptions [ 'trigger' ] , //  The type of expansion: single or many //  This must be one of static::EXPAND_TYPE_SINGLE or static::EXPAND_TYPE_MANY 'type' => $ aOptions [ 'type' ] , //  What property to assign the results of the expansion to 'property' => $ aOptions [ 'property' ] , //  Which model to use for the expansion 'model' => $ aOptions [ 'model' ] , //  The provider of the model 'provider' => $ aOptions [ 'provider' ] , //  Any data to pass to the getAll (every time) 'data' => ArrayHelper :: getFromArray ( 'data' , $ aOptions , [ ] ) , /**
             * The ID column to use; for EXPANDABLE_TYPE_SINGLE this is property of the
             * parent object which contains the ID, for EXPANDABLE_TYPE_MANY, this is the
             * property of the child object which contains the parent's ID.
             */ 'id_column' => $ aOptions [ 'id_column' ] , //  Whether the field is expanded by default 'auto_expand' => ArrayHelper :: getFromArray ( 'auto_expand' , $ aOptions , false ) , //  Whether to automatically save expanded objects when the trigger is //  passed as a key to the create or update methods 'auto_save' => $ bAutoSave , ] ; return $ this ; }
Define expandable objects

@param array $aOptions An array describing the expandable field

@return $this
@throws ModelException
Define expandable objects