2013-04-11 18 views
5

Se una tabella ha valori predefiniti su determinati campi e NULL non è consentito, ci si aspetterebbe che lo script di inserimento utilizzi tali valori predefiniti, come fa solitamente MariaDB/MySQL. Ad esempio, se i prodotti da tavola comprende un campo AI "id", un campo "nome" necessaria e due campi "attivo" e "vetrina" che sia predefinita su 1, la queryCome rendere i modelli utilizzare i valori di default in Phalcon PHP Framework?

INSERT INTO products (name) VALUES ('someName'); 

inserisce automaticamente 1 come valore di attivo e in primo piano. Tuttavia, quando si utilizza modelli di Phalcon in questo modo:

$product = new Products(); 
$product->setName('someName'); 
$product->save(); 

errori di convalida restituisce dicendo "attivo" e "In primo piano" sono obbligatori.

C'è una bandiera che dovrei fornire durante la generazione del modello affinché gli strumenti di Phalcon raccolgano e inseriscano i valori di default nelle classi del modello, o un altro modo per far sì che Phalcon utilizzi automaticamente i valori di default se trovati? Il miglior approccio sarebbe semplicemente ignorare i campi che non erano stati impostati, a mio parere. Posso fare i modelli farlo?

risposta

9

È possibile utilizzare un valore del database prima per evitare che, in inserti specifici:

<?php 

use Phalcon\Db\RawValue; 

$product = new Products(); 
$product->setName('someName'); 
$product->setType(new RawValue('default')); //use default here 
$product->save(); 

Oppure, generale prima di creare/aggiornamento per campi specifici:

use Phalcon\Db\RawValue; 

class Products extends Phalcon\Mvc\Model 
{ 
    public function beforeValidationOnCreate() 
    { 
     $this->type = new RawValue('default'); 
    } 
} 

o ignorare questi campi in ogni SQL INSERT generato:

use Phalcon\Db\RawValue; 

class Products extends Phalcon\Mvc\Model 
{ 
    public function initialize() 
    { 
     $this->skipAttributesOnCreate(array('type')); 
    } 
} 
+1

brillante, grazie – Swader

+0

miglioramenti @twistedxtra minori: '$ this-> digitare = $ this-> digitare: new rawValue ('default');'?. Ma in ogni caso - grazie! :) – klay

2

Anche se trovo la risposta di twistedxtra affascinante dall'aspetto ct che Phalcon contiene questo metodo malvagio per leggere l'impostazione predefinita della colonna, credo che da un punto di vista architettonico questo potrebbe essere l'approccio sbagliato in quanto ci si basa sul database per definire i valori predefiniti delle proprietà del modello.

Imposterei il valore predefinito quando dichiarare la proprietà e mantenere la logica nel livello applicazione. Ma sono solo io.

+0

L'approccio architettonico "corretto" non dovrebbe applicare tale valore predefinito a livello di DB? Almeno in questo modo non si finisce mai con dati cattivi. –

0

Usa come di seguito

Lo skipAttributesOnCreate farà in modo Phalcon non tenta di mettere un valore in quella colonna. Il database applicherà il valore predefinito.

public function initialize() 
{ 
    $this->setSource('table_name'); 
    $this->skipAttributesOnCreate(['name_of_column']); 
} 
+1

Ciao Deji, benvenuto su StackOverflow. Quando rispondi alle domande qui, devi sempre fornire spiegazioni e descrizioni per aiutare a risolvere il problema in questione. Pubblicare un blocco di codice solitamente non è utile e non fornisce alcun contesto. Si prega di considerare l'aggiornamento della risposta qui. –

Problemi correlati