2014-04-30 29 views
12

Nach der Instantiierung einer Modellklasse, die Laravels Eloquent Model-Klasse erweitert, gibt es eine Möglichkeit festzustellen, ob die Eigenschaft/das Attribut der Tabelle zugeordnet ist und daher in der Tabelle gespeichert werden kann? Beispielsweise habe ich eine Tabelle announcements mit Spalten id, text und "created_by".Laravel Eloquent Modellattribute

Wie kann ich wissen, created_by ist ein Attribut und wird gespeichert, wenn festgelegt?

$announcement = new Announcement(); 

isset($announcement->created_by) gibt verständlicherweise falsch, wenn ich nicht explizit den Wert noch eingestellt. Ich habe verschiedene Funktionen aus der Eloquent-Modellklasse ausprobiert, aber bisher hat noch niemand gearbeitet. Ich suche nach etwas wie:

$announcement->doesThisMapToMyTable('created_by'), die wahr zurückgibt, ob $announcement->created_by festgelegt wurde oder nicht.

+1

Mattcore, beachten Sie bitte @Leith [einfache Antwort] (http Einstellung://stackoverflow.com/a/40057527/3810453) als akzeptiert. Es ist einfach und kurz und wird tun, was Sie gefragt haben – Zanshin13

Antwort

5

Für Laravel 5.4:

$hasCreatedAt = \Schema::hasColumn(app(Model::class)->getTable(), 'created_at'); 

    if($hasCreatedAt == true) { 
     ... 
    } 
+0

Ja, so schön und einfach. Jeder, der Laravel 5.4 benutzt, sollte diese Antwort beantworten. –

19

Wenn Ihr Modell mit Daten gefüllt ist, können Sie:

$announcement = Announcement::find(1); 

$attributes = $announcement->getAttributes(); 

isset($attributes['created_by']); 

Für leere Modelle (neue Modelle), leider sehen Sie die Spalten erhalten müssen einen kleinen Hack. Fügen Sie diese Methode, um Ihre Basemodel:

<?php 

class BaseModel extends Eloquent { 

    public function getAllColumnsNames() 
    { 
     switch (DB::connection()->getConfig('driver')) { 
      case 'pgsql': 
       $query = "SELECT column_name FROM information_schema.columns WHERE table_name = '".$this->getTable()."'"; 
       $column_name = 'column_name'; 
       $reverse = true; 
       break; 

      case 'mysql': 
       $query = 'SHOW COLUMNS FROM '.$this->getTable(); 
       $column_name = 'Field'; 
       $reverse = false; 
       break; 

      case 'sqlsrv': 
       $parts = explode('.', $this->getTable()); 
       $num = (count($parts) - 1); 
       $table = $parts[$num]; 
       $query = "SELECT column_name FROM ".DB::connection()->getConfig('database').".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'".$table."'"; 
       $column_name = 'column_name'; 
       $reverse = false; 
       break; 

      default: 
       $error = 'Database driver not supported: '.DB::connection()->getConfig('driver'); 
       throw new Exception($error); 
       break; 
     } 

     $columns = array(); 

     foreach(DB::select($query) as $column) 
     { 
      $columns[$column->$column_name] = $column->$column_name; // setting the column name as key too 
     } 

     if($reverse) 
     { 
      $columns = array_reverse($columns); 
     } 

     return $columns; 
    } 

} 

Erweitern Sie Ihr Modell von ihm:

class Announcement extends BaseModel { 

} 

Dann werden Sie in der Lage:

$columns = $announcement->getAllColumnsNames(); 

isset($columns['created_by']); 
+0

Danke, aber sowohl $ ansage-> Attribute und $ ankündigung-> getAttributes() geben NULL zurück. – mattcrowe

+0

Ja, bei leeren Modellen hast du keinen Zugriff darauf, also habe ich gerade eine Methode hinzugefügt, die ich in meinen Apps verwende. –

+0

Die Verwendung von isset() gab mir Probleme auf meinem Ubuntu Server 12.04 LTS mit PHP 5.5. – sidneydobber

-1

ich !empty($announcement->created_by) verwendet und es ist große Arbeit für mein

4

Anstatt Ihre eigenen Lookup in die Datenbank Interna schreiben, können Sie einfach t verwenden er Schema facade zu suchen, um die Spalten nach oben:

use Illuminate\Support\Facades\Schema; 

$announcement = new Announcement(); 
$column_names = Schema::getColumnListing($announcement->getTable()); 
if (isset($column_names['created_by'])) { 
    // whatever you need 
} 
0

Laravel 5.4

Ich benutzte Leiths Antwort generic Hilfsmethode zu erstellen, die automatisch Karten JS-Objekt Laravel Modell (und ignoriert im Wesentlichen die Eigenschaften, die nicht Teil des Modells sind, wodurch QueryBuilder-Fehlermeldungen für nicht definierte Spalten vermieden werden). Zusätzlich enthält einfache createOrEdit -Ansatz (obwohl nicht hat -Validierung "existiert ID?"):

public function store(Request $request) { 
 
     if($request->input("club")) { 
 
      $club = \App\Club::find($request->input("club")["id"]); 
 
     } else { 
 
      $club = new \App\Club; 
 
     } 
 
     $club = self::mapModel($request->input("club"), $club); 
 
     $club->save(); 
 
    } 
 
    
 
    public function mapModel($input,$model) { 
 
     $columns = Schema::getColumnListing($model->getTable()); 
 
     foreach ($columns as $i => $key) { 
 
      if($input[$key]) { 
 
       $model->{$key} = $input[$key]; 
 
      } 
 
     } 
 
     return $model; 
 
    }