Colonna della tabella "status" automatizzata in base all'utilizzo o meno di un valore su un'altra tabella

Ciao a tutti, ho due tabelle in cui in una prendo i dati di una colonna e li uso in un’altra. Tuttavia, desidero che la tabella da cui viene preso il valore contenga una colonna “status” in cui viene automaticamente valutata come, ad esempio, “non disponibile”. Come spiegazione non è sicuramente delle migliori. Ecco lo screenshot:

Quindi, se utilizzo il PC001 su “Gestione PC”, questo deve risultare non disponibile nell’Elenco Numerazioni, il massimo sarebbe non farlo apparire anche nel menu a tendina nel form di Gestione PC.

app\models\Numeri.php
namespace app\models;

use Da\User\Model\User;
use Yii;
use yii\db\Expression;
use yii\behaviors\TimestampBehavior;
use yii\behaviors\BlameableBehavior;

/**
 * This is the model class for table "{{%numeri}}".
 *
 * @property int $id_numeri
 * @property string|null $numeri Numerazioni
 * @property string|null $created_at Data inserimento
 * @property int|null $created_by Inserito da
 * @property string|null $updated_at Data modifica
 * @property int|null $updated_by Modificato da
 *
 * @property Gestionalepc $gestionalepc
 */
class Numeri extends \yii\db\ActiveRecord
{

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

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'updated_at',
                'value' => new Expression('NOW()'),
            ],
            [
                'class' => BlameableBehavior::className(),
                'createdByAttribute' => 'created_by',
                'updatedByAttribute' => 'updated_by',
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['elenconumeri'], 'string', 'max' => 80],
            [['elenconumeri'], 'unique'],
            [['elenconumeri'], 'required'],
            [['elenconumeri', 'status'], 'safe'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id_numeri' => Yii::t('app', 'Id Numeri'),
            'elenconumeri' => Yii::t('app', 'Nr.'),
            'status' => Yii::t('app', 'Status'),
            'created_at' => Yii::t('app', 'Data inserimento'),
            'created_by' => Yii::t('app', 'Inserito da'),
            'updated_at' => Yii::t('app', 'Data modifica'),
            'updated_by' => Yii::t('app', 'Modificato da'),
        ];
    }

    public function getCreatore()
    {
        return $this->hasOne(User::className(), ['id' => 'created_by']);
    }

    public function getModificatore()
    {
        return $this->hasOne(User::className(), ['id' => 'updated_by']);
    }

    public function getGestionalepc()
    {
        return $this->hasMany(Gestionalepc::className(), ['numerazioni' => 'id_numeri']);
    }


    /**
     * {@inheritdoc}
     * @return NumeriQuery the active query used by this AR class.
     */
    public static function find()
    {
        return new NumeriQuery(get_called_class());
    }
}
app\controllers\NumeriController.php
namespace app\controllers;

use Yii;
use app\models\Numeri;
use app\models\NumeriSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

/**
 * NumeriController implements the CRUD actions for Numeri model.
 */
class NumeriController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['index', 'view'],
                        'roles' => ['visualizza-base']
                    ],
                    [
                        'allow' => true,
                        'actions' => ['update'],
                        'roles' => ['aggiorna-base']
                    ],
                    [
                        'allow' => true,
                        'actions' => ['create'],
                        'roles' => ['crea-base']
                    ],
                    [
                        'allow' => true,
                        'actions' => ['delete'],
                        'roles' => ['elimina-base']
                    ],

                    [
                        'allow' => false
                    ]
                ]
            ]
        ];
    }

    /**
     * Lists all Numeri models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new NumeriSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Numeri model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Numeri model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Numeri();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id_numeri]);
        }

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

    /**
     * Updates an existing Numeri model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id_numeri]);
        }

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

    /**
     * Deletes an existing Numeri model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the Numeri model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Numeri the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Numeri::findOne($id)) !== null) {
            return $model;
        }

        throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
    }
}
app\views\numeri\index.php
use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\Pjax;
use app\models\Gestionalepc;
/* @var $this yii\web\View */
/* @var $searchModel app\models\NumeriSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = Yii::t('app', 'Elenco Numerazioni');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="numeri-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a(Yii::t('app', 'Aggiungi nuovo'), ['create'], ['class' => 'btn btn-success']) ?>
    </p>

    <?php Pjax::begin(); ?>
    <?php // echo $this->render('_search', ['model' => $searchModel]); 
    ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            //'id_numeri',
            'elenconumeri',
            'status',
            'created_at:datetime',
            [
                'attribute' => 'created_by',
                'value' => 'creatore.username',
            ],
            'updated_at:datetime',
            [
                'attribute' => 'updated_by',
                'value' => 'modificatore.username',
            ],
            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

    <?php Pjax::end(); ?>

</div>
table "numeri" in mysql
CREATE TABLE `numeri` (
  `id_numeri` int(11) NOT NULL,
  `elenconumeri` varchar(80) DEFAULT NULL COMMENT 'Numerazioni',
  `status` int(11) DEFAULT '0' COMMENT 'Status',
  `created_at` timestamp NULL DEFAULT NULL COMMENT 'Data inserimento',
  `created_by` int(11) DEFAULT NULL COMMENT 'Inserito da',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT 'Data modifica',
  `updated_by` int(11) DEFAULT NULL COMMENT 'Modificato da'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `numeri`
  ADD PRIMARY KEY (`id_numeri`),
  ADD UNIQUE KEY `numeri_UNIQUE` (`elenconumeri`),
  ADD KEY `created_by` (`created_by`,`updated_by`),
  ADD KEY `status` (`status`);

Ho provato anche a inserire sul model Numeri.php

class Numeri extends \yii\db\ActiveRecord
{
    const STATUS_DISPONIBILE = 0;
    const STATUS_INDISPONIBILE = 1;

Ma li mi fermo.

Grazie in anticipo.

Nel model Numeri che hai postato le colonne della grid (views\numeri\index.php) “elenconumeri” e “status” non esistono.

Forse sono colonne che hai aggiunto dopo e non hai aggiornato l’intestazione del model Numeri?

Ciao @fabriziocaldarelli, ho inserito la colonna “status” dopo sul model Numeri.
Nella Gridview su index.php di numeri ho messo:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        //'id_numeri',
        'elenconumeri',
        'status',
        'created_at:datetime',
        [
            'attribute' => 'created_by',
            'value' => 'creatore.username',
        ],
        'updated_at:datetime',
        [
            'attribute' => 'updated_by',
            'value' => 'modificatore.username',
        ],
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?> 

Mentre sul Model nelle rules() ho inserito:

public function rules()
{
    return [
        [['elenconumeri'], 'string', 'max' => 80],
        [['elenconumeri'], 'unique'],
        [['elenconumeri'], 'required'],
        [['elenconumeri', 'status'], 'safe'],
    ];
}

e inserito la relazione con Gestionalepc cosi:

public function getGestionalepc()
{
    return $this->hasMany(Gestionalepc::className(), ['numerazioni' => 'id_numeri']);
}

Ho provato inserendo sul model Gestionalepc

public function addStatusnumeri($insert, $changedAttributes){
    if($insert){
        $this->numeri->update(['status' => 1]);
    }
}

In modo che inserendo un nuovo numero, questo aggiornasse la colonna “status” di Numeri a 1, ovvero indisponibile.

Sul model Numeri ho aggiunto:

class Numeri extends \yii\db\ActiveRecord
{
    const STATUS_DISPONIBILE = 0;
    const STATUS_INDISPONIBILE = 1;

Non credo sia la soluzione corretta.
Di default quindi la colonna “status” potrebbe avere STATUS_DISPONIBILE non essendo ancora utilizzato quel numero.

Ma “status” non dovrebbe essere del model “Gestionalepc” ? Perchè si trova in Numeri ?

Risolviamo un problema alla volta e cioè prima di tutto l’appartenenza di status, che dovrebbe essere in Gestionalepc e non Numeri.

Il problema è che lo “status” si rende necessario per piu’ di un elemento, non solo su Numeri, ma in Indirizzip etc…
Dovrei quindi inserire vari status(non visibili o selezionabili) su Gestionalepc, ovvero nuove colonne “status_numeri”, “status_indirizzip”, etc?

Il model Gestionalepc è piuttosto lungo:

app\controllers\Gestionalepc
<?php

namespace app\models;

use Da\User\Model\User;
use Yii;
use yii\behaviors\BlameableBehavior;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;


class Gestionalepc extends \yii\db\ActiveRecord
{


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

    public static function find()
    {
        return new GestionalepcQuery(get_called_class());
    }

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'updated_at',
                'value' => new Expression('NOW()'),
            ],
            [
                'class' => BlameableBehavior::className(),
                'createdByAttribute' => 'created_by',
                'updatedByAttribute' => 'updated_by',
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['id_gestionalepc'], 'integer'],
            [['numerazioni', 'ip', 'uffici', 'sezione','cognomi', 'nomi', 'matricole', 'codprod', 'marchepc', 'modpc', 'tipologie', 'os', 'reti', 'processori', 'rams', 'lettoricd', 'marhdd', 'matrhdd', 'hdds', 'scvideo', 'scaudio', 'screte', 'marmon', 'matrmon', 'martast', 'matrtast', 'marmou', 'matrmouse', 'marlettcmd', 'matrlettcmd', 'margrp', 'matrgrp', 'stus', 'softlic'], 'safe'],
            [['created_at', 'updated_at', 'elenconumeri', 'elencoip', 'elencoufficio', 'elencosezione', 'elencocognome', 'elenconome', 'elencotipologia', 'elencosistop', 'elencorete', 'elencostatouso', 'elencomatricolapc', 'elencocodprod', 'elencomarcapc', 'elencomodellopc', 'elencocpu', 'elencoram', 'elencohdd', 'elencomatricolahdd', 'elencoschedavideo', 'elencoschedaudio', 'elencosoftlic','elencolettorecd', 'elencomarcahdd', 'elencoschedarete','elencomarcamonitor','elencomatricolamonitor','elencomarcatastiera','elencomatricolatastiera','elencomarcamouse','elencomatricolamouse','elencomarcalettorecmd','elencomatricolalettorecmd','elencomarcagruppo','elencomatricolagruppo','elencostatouso'], 'safe'],
            [['elenconumeri', 'elencoip', 'elencoufficio', 'elencosezione', 'elencocognome', 'elenconome', 'elencotipologia', 'elencosistop', 'elencorete', 'elencostatouso'], 'required'],
            [['numerazioni', 'ip', 'uffcomp', 'sezione', 'cognomi', 'nomi','marchepc', 'modpc', 'tipologie', 'os', 'reti','stus'], 'required'],
            [['numerazioni'], 'unique'],
            [['ip'], 'unique'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id_gestionalepc' => Yii::t('app', 'Id Gestionalepc'),
            'numerazioni' => Yii::t('app', 'Nr.'),
            'elenconumeri' => Yii::t('app', 'Nr.'),
            'ip' => Yii::t('app', 'IP'),
            'elencoip' => Yii::t('app', 'IP'),
            'ufficio' => Yii::t('app', 'Ufficio'),
            'elencoufficio' => Yii::t('app', 'Ufficio'),
            'sezione' => Yii::t('app', 'Sezione/Nucleo'),
            'elencosezione' => Yii::t('app', 'Sezione/Nucleo'),
            'cognomi' => Yii::t('app', 'Cognome'),
            'elencocognome' => Yii::t('app', 'Cognome'),
            'nomi' => Yii::t('app', 'Nome'),
            'elenconome' => Yii::t('app', 'Nome'),
            'matricole' => Yii::t('app', 'Matricola'),
            'elencomatricolapc' => Yii::t('app', 'Matricola'),
            'codprod' => Yii::t('app', 'Cod. PC'),
            'elencoprod' => Yii::t('app', 'Cod. PC'),
            'marchepc' => Yii::t('app', 'Marca'),
            'elencomarcapc' => Yii::t('app', 'Marca'),
            'modpc' => Yii::t('app', 'Modello'),
            'elencomodellopc' => Yii::t('app', 'Modello'),
            'tipologie' => Yii::t('app', 'Tipologia'),
            'elencotipologia' => Yii::t('app', 'Tipologia'),
            'os' => Yii::t('app', 'Sistema Operativo'),
            'elencosistop' => Yii::t('app', 'Sistema Operativo'),
            'softlic' => Yii::t('app', 'Software Licenziati'),
            'elencosoftlic' => Yii::t('app', 'Software Licenziati'),
            'reti' => Yii::t('app', 'Rete'),
            'elencorete' => Yii::t('app', 'Rete'),
            'processori' => Yii::t('app', 'CPU'),
            'elencocpu' => Yii::t('app', 'CPU'),
            'rams' => Yii::t('app', 'RAM'),
            'elencoram' => Yii::t('app', 'RAM'),
            'lettoricd' => Yii::t('app', 'Lettore CD/DVD'),
            'elencolettorecd' => Yii::t('app', 'Lettore CD/DVD'),
            'marhdd' => Yii::t('app', 'Marca HDD'),
            'elencomarcahdd' => Yii::t('app', 'Marca HDD'),
            'matrhdd' => Yii::t('app', 'Matricola HDD'),
            'elencomatricolahdd' => Yii::t('app', 'Matricola HDD'),
            'hdds' => Yii::t('app', 'HDD'),
            'elencohdd' => Yii::t('app', 'HDD'),
            'scvideo' => Yii::t('app', 'Scheda Video'),
            'elencoschedavideo' => Yii::t('app', 'Scheda Video'),
            'scaudio' => Yii::t('app', 'Scheda Audio'),
            'elencoschedaudio' => Yii::t('app', 'Scheda Audio'),
            'screte' => Yii::t('app', 'Scheda Rete'),
            'elencoschedarete' => Yii::t('app', 'Scheda Rete'),
            'marmon' => Yii::t('app', 'Marca Monitor'),
            'elencomarcamonitor' => Yii::t('app', 'Marca Monitor'),
            'matrmon' => Yii::t('app', 'Matricola Monitor'),
            'elencomatricolamonitor' => Yii::t('app', 'Matricola Monitor'),
            'martast' => Yii::t('app', 'Marca Tastiera'),
            'elencomarcatastiera' => Yii::t('app', 'Marca Tastiera'),
            'matrtast' => Yii::t('app', 'Matricola Tastiera'),
            'elencomatricolatastiera' => Yii::t('app', 'Matricola Tastiera'),
            'marmou' => Yii::t('app', 'Marca Mouse'),
            'elencomarcamouse' => Yii::t('app', 'Marca Mouse'),
            'matrmouse' => Yii::t('app', 'Matricola Mouse'),
            'elencomatricolamouse' => Yii::t('app', 'Matricola Mouse'),
            'marlettcmd' => Yii::t('app', 'Marca Lettore SMART CARD'),
            'elencomarcalettorecmd' => Yii::t('app', 'Marca Lettore SMART CARD'),
            'matrlettcmd' => Yii::t('app', 'Matricola Lettore SMART CARD'),
            'elencomatricolalettorecmd' => Yii::t('app', 'Matricola Lettore SMART CARD'),
            'margrp' => Yii::t('app', 'Marca UPS'),
            'elencomarcagruppo' => Yii::t('app', 'Marca UPS'),
            'matrgrp' => Yii::t('app', 'Matricola UPS'),
            'elencomatricolagruppo' => Yii::t('app', 'Matricola UPS'),
            'stus' => Yii::t('app', 'Stato Uso Materiale'),
            'elencostatouso' => Yii::t('app', 'Stato Uso Materiale'),
            'created_at' => Yii::t('app', 'Data inserimento'),
            'created_by' => Yii::t('app', 'Inserito da'),
            'updated_at' => Yii::t('app', 'Data modifica'),
            'updated_by' => Yii::t('app', 'Modificato da'),
        ];
    }

    public function addSistop($insert, $changedAttributes){
        if($insert){
                $this->sistop->updateCounters(['qusistop' => 1]);
        }
    }

    public function addSoftlic($insert, $changedAttributes){
        if($insert){
            $this->softlicenziati->updateCounters(['qusoftlic' => 1]);
        }
    }

    public function addStatusnumeri($insert, $changedAttributes){
        if($insert){
            $this->numeri->update(['status' => 1]);
        }
    }

    public function getCognome()
    {
        return $this->hasOne(Cognome::className(), ['id_cognome' => 'cognomi']);
    }

    public function getElencocognome()
    {
        return $this->cognome->elencocognome;
    }

    public function getHdd()
    {
        return $this->hasOne(Hdd::className(), ['id_hdd' => 'hdds']);
    }

    public function getElencohdd()
    {
        return $this->hdd->elencohdd;
    }

    public function getIndirizzoip()
    {
        return $this->hasOne(Indirizzoip::className(), ['id_indirizzoip' => 'ip']);
    }

    public function getElencoip()
    {
        return $this->indirizzoip->elencoip;
    }

    public function getLettorecd()
    {
        return $this->hasOne(Lettorecd::className(), ['id_lettorecd' => 'lettoricd']);
    }

    public function getElencolettorecd()
    {
        return $this->lettorecd->elencolettorecd;
    }

    public function getMarcapc()
    {
        return $this->hasOne(Marcapc::className(), ['id_marcapc' => 'marchepc']);
    }

    public function getElencomarcapc()
    {
        return $this->marcapc->elencomarcapc;
    }

    public function getModellopc()
    {
        return $this->hasOne(Modellopc::className(), ['id_modellopc' => 'modpc']);
    }

    public function getElencomodellopc()
    {
        return $this->modellopc->elencomodellopc;
    }

    public function getMarcagruppo()
    {
        return $this->hasOne(Marcagruppo::className(), ['id_marcagruppo' => 'margrp']);
    }

    public function getElencomarcagruppo()
    {
        return $this->marcagruppo->elencomarcagruppo;
    }

    public function getMarcahdd()
    {
        return $this->hasOne(Marcahdd::className(), ['id_marcahdd' => 'marhdd']);
    }

    public function getElencomarcahdd()
    {
        return $this->marcahdd->elencomarcahdd;
    }

    public function getMatricolahdd()
    {
        return $this->hasOne(Matricolahdd::className(), ['id_matricolahdd' => 'matrhdd']);
    }

    public function getElencomatricolahdd()
    {
        return $this->matricolahdd->elencomatricolahdd;
    }

    public function getMarcalettorecmd()
    {
        return $this->hasOne(Marcalettorecmd::className(), ['id_marcalettorecmd' => 'marlettcmd']);
    }

    public function getElencomarcalettorecmd()
    {
        return $this->marcalettorecmd->elencomarcalettorecmd;
    }

    public function getMarcamonitor()
    {
        return $this->hasOne(Marcamonitor::className(), ['id_marcamonitor' => 'marmon']);
    }

    public function getElencomarcamonitor()
    {
        return $this->marcamonitor->elencomarcamonitor;
    }

    public function getMarcamouse()
    {
        return $this->hasOne(Marcamouse::className(), ['id_marcamouse' => 'marmou']);
    }

    public function getElencomarcamouse()
    {
        return $this->marcamouse->elencomarcamouse;
    }

    public function getMarcatastiera()
    {
        return $this->hasOne(Marcatastiera::className(), ['id_marcatastiera' => 'martast']);
    }

    public function getElencomarcatastiera()
    {
        return $this->marcatastiera->elencomarcatastiera;
    }

    public function getMatricolagruppo()
    {
        return $this->hasOne(Matricolagruppo::className(), ['id_matricolagruppo' => 'matrgrp']);
    }

    public function getElencomatricolagruppo()
    {
        return $this->matricolagruppo->elencomatricolagruppo;
    }

    public function getMatricolapc()
    {
        return $this->hasOne(Matricolapc::className(), ['id_matricolapc' => 'matricole']);
    }

    public function getElencomatricolapc()
    {
        return $this->matricolapc->elencomatricolapc;
    }

    public function getMatricolalettorecmd()
    {
        return $this->hasOne(Matricolalettorecmd::className(), ['id_matricolalettorecmd' => 'matrlettcmd']);
    }

    public function getElencomatricolalettorecmd()
    {
        return $this->matricolalettorecmd->elencomatricolalettorecmd;
    }

    public function getMatricolamonitor()
    {
        return $this->hasOne(Matricolamonitor::className(), ['id_matricolamonitor' => 'matrmon']);
    }

    public function getElencomatricolamonitor()
    {
        return $this->matricolamonitor->elencomatricolamonitor;
    }

    public function getMatricolamouse()
    {
        return $this->hasOne(Matricolamouse::className(), ['id_matricolamouse' => 'matrmouse']);
    }

    public function getElencomatricolamouse()
    {
        return $this->matricolamouse->elencomatricolamouse;
    }

    public function getMatricolatastiera()
    {
        return $this->hasOne(Matricolatastiera::className(), ['id_matricolatastiera' => 'matrtast']);
    }

    public function getElencomatricolatastiera()
    {
        return $this->matricolatastiera->elencomatricolatastiera;
    }

    public function getNome()
    {
        return $this->hasOne(Nome::className(), ['id_nome' => 'nomi']);
    }

    public function getElenconome()
    {
        return $this->nome->elenconome;
    }

    public function getCodprod()
    {
        return $this->hasOne(Codprod::className(), ['id_nuc' => 'codprod']);
    }

    public function getElencocodprod()
    {
        return $this->codprod->elencocodprod;
    }

    public function getNumeri()
    {
        return $this->hasOne(Numeri::className(), ['id_numeri' => 'numerazioni']);
    }

    public function getElenconumeri()
    {
        return $this->numeri->elenconumeri;
    }

    public function getSistop()
    {
        return $this->hasOne(Sistop::className(), ['id_sistop' => 'os']);
    }

    public function getElencosistop()
    {
        return $this->sistop->elencosistop;
    }

    public function getSoftlicenziati()
    {
        return $this->hasOne(Softlicenziati::className(), ['id_softlicenziati' => 'softlic']);
    }

    public function getElencosoftlic()
    {
        return $this->softlicenziati->elencosoftlic;
    }

    public function getCpu()
    {
        return $this->hasOne(Cpu::className(), ['id_cpu' => 'processori']);
    }

    public function getElencocpu()
    {
        return $this->cpu->elencocpu;
    }

    public function getRam()
    {
        return $this->hasOne(Ram::className(), ['id_ram' => 'rams']);
    }

    public function getElencoram()
    {
        return $this->ram->elencoram;
    }

    public function getRete()
    {
        return $this->hasOne(Rete::className(), ['id_rete' => 'reti']);
    }

    public function getElencorete()
    {
        return $this->rete->elencorete;
    }

    public function getSchedaudio()
    {
        return $this->hasOne(Schedaudio::className(), ['id_schedaudio' => 'scaudio']);
    }

    public function getElencoschedaudio()
    {
        return $this->schedaudio->elencoschedaudio;
    }

    public function getSchedarete()
    {
        return $this->hasOne(Schedarete::className(), ['id_schedarete' => 'screte']);
    }

    public function getElencoschedarete()
    {
        return $this->schedarete->elencoschedarete;
    }

    public function getSchedavideo()
    {
        return $this->hasOne(Schedavideo::className(), ['id_schedavideo' => 'scvideo']);
    }

    public function getElencoschedavideo()
    {
        return $this->schedavideo->elencoschedavideo;
    }

    public function getSezione()
    {
        return $this->hasOne(Sezione::className(), ['id_sezione' => 'sezione']);
    }

    public function getElencosezione()
    {
        return $this->sezione->elencosezione;
    }

    public function getStatouso()
    {
        return $this->hasOne(Statouso::className(), ['id_statouso' => 'stus']);
    }

    public function getElencostatouso()
    {
        return $this->statouso->elencostatouso;
    }

    public function getTipologia()
    {
        return $this->hasOne(Tipologia::className(), ['id_tipologia' => 'tipologie']);
    }

    public function getElencotipologia()
    {
        return $this->tipologia->elencotipologia;
    }

    public function getUfficio()
    {
        return $this->hasOne(Ufficio::className(), ['id_ufficio' => 'uffcomp']);
    }

    public function getElencoufficio()
    {
        return $this->ufficio->elencoufficio;
    }

    public function getCreatore()
    {
        return $this->hasOne(User::className(), ['id' => 'created_by']);
    }

    public function getModificatore()
    {
        return $this->hasOne(User::className(), ['id' => 'updated_by']);
    }
}

Per questo lo status lo stavo inserendo nei model “collegati”, gli elementi su cui devo avere la situazione di utilizzo o meno sono molteplici, non tutti ma una buona parte.

Puoi comunque aggiornare il singolo status su Numeri in funzione delle modifiche fatte sugli altri record di altre tabelle. E’ comunque consigliabile avere un unico campo “status” dove far convogliare i valori da tutti i record, anzichè verificare n condizioni di status.

Buongiono @fabriziocaldarelli, avere un unico campo “status” dove far convogliare i valori da tutti i record sarebbe senza dubbio la soluzione migliore, ma ho tre dubbi:

  1. se ho capito bene il campo “status” è da inserire su gestionalepc e nel mio caso deve prevedere solo due opzioni “disponibile” e “non disponibile”?
  2. sarebbe opportuno inserirlo anche su mysql e in quel caso dovrei usare un valore integer per creare la relazione tra le varie tabelle? (campo “status” su gestionalepc e campo “status_numeri” su numeri e cosi via per le altre tabelle sempre in relazione al campo “status”)
  3. far convogliare i valori da tutti i record non l’ho mai fatto e non saprei da dove trarne spunto.

Ho provato questa alternativa, in pratica join di due tabelle in questo modo:

app\models\Numeri.php
namespace app\models;

use Da\User\Model\User;
use Yii;
use yii\db\Expression;
use yii\behaviors\TimestampBehavior;
use yii\behaviors\BlameableBehavior;

/**
 * This is the model class for table "{{%numeri}}".
 *
 * @property int $id_numeri
 * @property string|null $numeri Numerazioni
 * @property string|null $created_at Data inserimento
 * @property int|null $created_by Inserito da
 * @property string|null $updated_at Data modifica
 * @property int|null $updated_by Modificato da
 *
 * @property Gestionalepc $gestionalepc
 */
class Numeri extends \yii\db\ActiveRecord
{

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

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'updated_at',
                'value' => new Expression('NOW()'),
            ],
            [
                'class' => BlameableBehavior::className(),
                'createdByAttribute' => 'created_by',
                'updatedByAttribute' => 'updated_by',
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['created_by', 'updated_by'], 'integer'],
            [['created_at', 'updated_at'], 'safe'],
            [['elenconumeri'], 'string', 'max' => 80],
            [['elenconumeri'], 'unique'],
            [['status'], 'exist', 'skipOnError' => true, 'targetClass' => Gestionalepc::className(), 'targetAttribute' => ['status' => 'numerazioni']],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
    return [
        'id_numeri' => Yii::t('app', 'Id Numeri'),
        'elenconumeri' => Yii::t('app', 'Nr.'),
        'status' => Yii::t('app', 'Status'),
        'created_at' => Yii::t('app', 'Data inserimento'),
        'created_by' => Yii::t('app', 'Inserito da'),
        'updated_at' => Yii::t('app', 'Data modifica'),
        'updated_by' => Yii::t('app', 'Modificato da'),
    ];
    }

    public function getCreatore()
    {
        return $this->hasOne(User::className(), ['id' => 'created_by']);
    }

    public function getModificatore()
    {
        return $this->hasOne(User::className(), ['id' => 'updated_by']);
    }

    /**
     * Gets query for [[Gestionalepc]].
     *
     * @return \yii\db\ActiveQuery|GestionalepcQuery
     */
    public function getGestionalepc()
    {
        return $this->hasOne(Gestionalepc::className(), ['numerazioni' => 'id_numeri']);
    }

    /**
     * Gets query for [[Status0]].
     *
     * @return \yii\db\ActiveQuery|GestionalepcQuery
     */
    public function getUtilizzo()
    {
        return $this->hasOne(Gestionalepc::className(), ['numerazioni' => 'status']);
    }

    /**
     * {@inheritdoc}
     * @return NumeriQuery the active query used by this AR class.
     */
    public static function find()
    {
        return new NumeriQuery(get_called_class());
    }
}
app\models\NumeriSearch.php
namespace app\models;

use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\Numeri;

/**
 * NumeriSearch represents the model behind the search form of `app\models\Numeri`.
 */
class NumeriSearch extends Numeri
{
    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['id_numeri'], 'integer'],
            [['elenconumeri', 'status'], 'safe'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = Numeri::find();
        $query->joinWith(['gestionalepc']);
        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id_numeri' => $this->id_numeri,

        ]);

        $query->andFilterWhere(['like', 'elenconumeri', $this->elenconumeri])
              ->andFilterWhere(['like', 'gestionalepc.numerazioni', $this->status]);

        return $dataProvider;
    }
}

Mentre su views\numeri\index.php

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        //'id_numeri',
        'elenconumeri',
        [
            'attribute' => 'status',
            'value' => 'gestionalepc.elenconumeri',
        ],
        'created_at:datetime',
        [
            'attribute' => 'created_by',
            'value' => 'creatore.username',
        ],
        'updated_at:datetime',
        [
            'attribute' => 'updated_by',
            'value' => 'modificatore.username',
        ],
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

Ora il problema è la funzione su ‘value’=‘gestionalepc.elenconumeri’

Dovrei far visualizzare lo status “Non disponibile” se il campo status è identico a elenconumeri e viceversa “non disponibile” se è differente o vuoto

  1. Esatto
  2. Esatto, se gli stati sono 2, potresti creare un campo int con 2 valori: 0 e 1.
  3. Semplicemente ad ogni modifica di un record che potrebbe cambiare lo status in gestionalepc, intercetti l’operazione di salvataggio (facendo la sovrascrittura del metodono afterSave del model) e vai ad aggiornare lo status di gestionalepc. Eventualmente potresti creare una tabella storico delle variazioni dove tracci tutte le variazione fatte e da quale model.

Prima che mi scrivessi avevo già fatto le modifiche che ho postato sopra e mi sono reso conto di essermi spiegato male o possono essere due modi di interprerare differenti. Sul gestionalepc quando “configuro un pc” non necessariamente devo inserire tutti i campi(componenti per intenderci) e lo status su gestionalepc inteso come “disponibile” o “non disponibile” non mi aiuta perchè mi darebbe la disponibilità o meno di quel pc inteso come completo di tutte le sue parti o comunque quelle inserite. L’esigenza è al contrario, nel senso che se voglio vedere quali numeri pc sono ancora disponibili per esempio, andando sulla voce di menu “Numerazioni” possa vedere e filtrare tra disponibili o non disponibili. Con il metodo “artigianale” che ho aggiunto sopra e quindi il semplice join delle tabelle l’esigenza è risolta parzialmente, mi manca la funzione che mi permetta di far apparire le due diciture, nello screenshot di sopra sulla colonna Elenconumeri PC005 e Status PC005 in pratica al posto di PC005 deve restituirmi Non disponibile e se il valore non è identico deve restituirmi Disponibile.
Se sto scrivendo fesserie non farti problemi, spero di averti illustrato al meglio la mia esigenza.
Credo che quella funzione di cui ho scritto sopra possa poi servirmi quando dal menu a tendina devo selezionare un numero pc su gestionalepc mostrandomi così solo quelli disponibili.
Ti ringrazio come sempre per i tuoi consigli sempre utili soprattutto per chi come me non è esperto, anzi alle prime armi ma oltre che appassionato volevo crearmi un gestionale senza l’utilizzo di software da installare e fruibile da chi ne ha titolo nel mio settore lavorativo.

Non mi è chiaro questo punto. Se il PC è con “status” = non_disponibile, nella query filtrando solo quelli con “status” = disponibile, gli altri non li vedresti.

Ho installato l’estensione di kartik per le gridview e inserito un’ulteriore colonna in questo modo:

sulla view di Numeri ho disposto le colonne:

[
    'header' => 'Status',
    'attribute' => 'status',
    'value' => function ($model) {
        return !empty($model->ip_ass) ? 'Not Available' : 'Available';
    },
],

Ma non funziona correttamente.
Mi manca un passaggio nella relazione:

return !empty($model->**mancante**->ip_ass) ? 'Not Available' : 'Available';

Su PC000 e su PC002 dovrebbe restituire ‘Not Available’ e poter essere filtrato tramite form come nelle colonne Nr. e Pc associato