web-dev-qa-db-fra.com

Vérifiez si la colonne existe dans Laravel table du modèle, puis appliquez la condition

Situation actuelle: Nous créons une nouvelle base de données pour une nouvelle inscription.

Problème: Si des modifications sont apportées à la migration de la base de données, nous devons le gérer pour la base de données créée précédemment. Ou exécutez cette migration pour chaque base de données créée précédemment.

Si nous exécutons la migration pour chaque base de données, aucun problème.

Question: comment vérifier que la table de base de données a une colonne pour laquelle nous appliquons une condition dans la requête.

Actuellement, je dois d'abord lancer deux requêtes pour la première ligne et vérifier l'existence de cette colonne, puis appliquer la condition dans la clause where. comme ci-dessous

$firstRow = Model::first();
if(isset($firstRow->is_splited)){
    $records = Model::where('is_splited',0)->get(); // this will give error if I don't check column existence for previously created database. 
}else{
    $records = Model::all();
}

Existe-t-il un moyen de réaliser dans une seule requête. Ou une meilleure façon de le faire?


Merci pour votre temps et vos suggestions.

6
Rishi Raut

@DigitalDrifter a donné une idée d'utiliser la classe Schema donc j'ai juste essayé comme ça

J'inclus la classe Schema

use Illuminate\Support\Facades\Schema;

Et vérifiez la colonne en utilisant la classe Schema, et cela fonctionne également

$isColExist = Schema::connection("connection_name")->hasColumn('table_name','is_splited');
$q = Acquire::with("block");
if($isColExist){
    $q->where('is_splited',0);
}
$records = $q->get();
7
Rishi Raut

Vous pouvez effectuer les opérations suivantes pour obtenir un tableau de classes Column:

$columns = $model->getConnection()->getDoctrineSchemaManager()->getColumns();

Il y a aussi getColumnListing et hasColumn .

6
DigitalDrifter

Solution mise à jour fonctionnant en 5.8

if ($object->getConnection()
           ->getSchemaBuilder()
           ->hasColumn($object->getTable(), 'column_name')) {
    // required update here
}

Cette solution nécessite uniquement un objet $ et un 'nom_colonne' pour fonctionner. Les noms de connexion et de table sont dérivés de l'objet lui-même.

4
wheelmaker