php - सिद्धांत में डिफ़ॉल्ट मूल्य




orm doctrine2 (10)

मैं सिद्धांत 2 में डिफ़ॉल्ट मान कैसे सेट करूं?


अद्यतन करें

सिम्फनी के लिए प्रलेखन को पढ़ने का एक और कारण कभी भी प्रवृत्ति से बाहर नहीं होगा। मेरे विशिष्ट मामले के लिए एक सरल समाधान है और field type विकल्प empty_data को डिफ़ॉल्ट मान पर सेट करना है।

दोबारा, यह समाधान केवल उस परिदृश्य के लिए है जहां एक फॉर्म में एक खाली इनपुट डीबी फ़ील्ड को शून्य पर सेट करता है।

पृष्ठभूमि

पिछले उत्तरों में से कोई भी मुझे अपने विशिष्ट परिदृश्य में मदद नहीं करता लेकिन मुझे एक समाधान मिला।

मेरे पास एक फॉर्म फ़ील्ड था जिसे अनुवर्ती व्यवहार करने की आवश्यकता थी:

  1. आवश्यक नहीं, खाली छोड़ दिया जा सकता है। (प्रयुक्त 'आवश्यक' => झूठा)
  2. यदि खाली छोड़ दिया गया है, तो इसे किसी दिए गए मान पर डिफ़ॉल्ट होना चाहिए। बेहतर उपयोगकर्ता अनुभव के लिए, मैंने इनपुट फ़ील्ड पर डिफ़ॉल्ट मान सेट नहीं किया है, बल्कि HTML विशेषता 'प्लेसहोल्डर' का उपयोग किया है क्योंकि यह कम अवरोधक है।

मैंने फिर यहां दी गई सभी सिफारिशों की कोशिश की। मुझे उन्हें सूचीबद्ध करने दें:

  • इकाई संपत्ति के लिए डिफ़ॉल्ट मान सेट करें:
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}
  • विकल्प एनोटेशन का प्रयोग करें:
@ORM\Column(name="foo", options={"default":"foo bar"})
  • कन्स्ट्रक्टर पर डिफ़ॉल्ट मान सेट करें:
/**
 * @Entity
 */
class myEntity {
    ...
    public function __construct()
    {
        $this->myColumn = 'myDefaultValue';
    }
    ...
}
इसमें से कोई भी काम नहीं करता है और सिम्फनी आपकी इकाई वर्ग का उपयोग कैसे करता है इसके कारण।

जरूरी

सिम्फनी फॉर्म फ़ील्ड्स एंटिटी क्लास पर सेट डिफ़ॉल्ट मान ओवरराइड करते हैं। मतलब, आपके डीबी के लिए आपकी स्कीमा में एक डिफ़ॉल्ट मान परिभाषित हो सकता है, लेकिन यदि आप अपना फॉर्म सबमिट करते समय एक गैर-आवश्यक फ़ील्ड खाली छोड़ देते हैं, तो form->handleRequest() आपके फॉर्म के form->handleRequest() form->isValid() विधि उन डिफ़ॉल्ट मानों को ओवरराइड कर देगी अपनी Entity वर्ग और उन्हें इनपुट फ़ील्ड मानों पर सेट करें। यदि इनपुट फ़ील्ड मान खाली हैं, तो यह Entity गुण को null सेट करेगा।

http://symfony.com/doc/current/book/forms.html#handling-form-submissions

मेरा कामकाज

form->handleRequest() बाद अपने कंट्रोलर पर डिफ़ॉल्ट मान सेट form->isValid() विधि:

...
if ($myEntity->getMyColumn() === null) {
    $myEntity->setMyColumn('myDefaultValue');
}
...

एक सुंदर समाधान नहीं है लेकिन यह काम करता है। मैं शायद एक validation group बना सकता हूं लेकिन ऐसे लोग हो सकते हैं जो इस समस्या को डेटा सत्यापन के बजाय डेटा रूपांतरण के रूप में देखते हैं, मैं इसे निर्णय लेने के लिए छोड़ देता हूं।

सेटर ओवरराइड (काम नहीं करता)

मैंने इस तरह Entity सेटर को ओवरराइड करने का भी प्रयास किया:

...
/**
 * Set myColumn
 *
 * @param string $myColumn
 *
 * @return myEntity
 */
public function setMyColumn($myColumn)
{
    $this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;

    return $this;
}
...

यह, हालांकि यह क्लीनर दिखता है, यह काम नहीं करता है । कारण यह है कि बुराई form->handleRequest() विधि डेटा को अद्यतन करने के लिए मॉडल के form->handleRequest() विधियों का उपयोग नहीं करती है form->setData() अधिक जानकारी के लिए form->setData() में खोदना)।


@romanb शानदार उत्तर में जोड़ना।

यह माइग्रेशन में थोड़ा ओवरहेड जोड़ता है, क्योंकि आप स्पष्ट रूप से शून्य क्षेत्र के बिना एक फ़ील्ड नहीं बना सकते हैं और बिना किसी डिफ़ॉल्ट मान के।

// this up() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");

//lets add property without not null contraint        
$this->addSql("ALTER TABLE tablename ADD property BOOLEAN");

//get the default value for property       
$object = new Object();
$defaultValue = $menuItem->getProperty() ? "true":"false";

$this->addSql("UPDATE tablename SET property = {$defaultValue}");

//not you can add constraint
$this->addSql("ALTER TABLE tablename ALTER property SET NOT NULL");

इस उत्तर के साथ, मैं आपको यह सोचने के लिए प्रोत्साहित करता हूं कि आपको डेटाबेस में डिफ़ॉल्ट स्थान की आवश्यकता क्यों है? और आम तौर पर यह वस्तुओं को शून्य बाधा के साथ बनाने की अनुमति देना है।


आप इसे एक्सएमएल का उपयोग करके भी कर सकते हैं:

<field name="acmeOne" type="string" column="acmeOne" length="36">
    <options>
        <option name="comment">Your SQL field comment goes here.</option>
        <option name="default">Default Value</option>
    </options>
</field>

इनमें से कोई भी मेरे लिए काम नहीं किया। मुझे सिद्धांत की साइट पर कुछ दस्तावेज मिलते हैं जो मान को डिफ़ॉल्ट मान सेट करने के लिए सीधे सेट करने के लिए कहते हैं।

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/faq.html

private $default = 0;

यह वह मूल्य डाला जो मैं चाहता था।


कन्स्ट्रक्टर में मूल्य निर्धारित करते समय, काम करेंगे लाइफसाइकिल घटनाओं का उपयोग करना बेहतर समाधान हो सकता है।

prePersist लाइफसाइक्ल इवेंट का लाभ prePersist , आप अपने डिफ़ॉल्ट मूल्य को केवल प्रारंभिक बने रहने पर अपनी इकाई पर सेट कर सकते हैं।


मेरे लिए एक MySQL डेटाबेस पर भी काम करता है:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: integer
            nullable: true
            options:
                default: 1

मैंने जो LifeCycleCallback किया वह LifeCycleCallback था। अभी भी यह देखने का इंतजार है कि क्या कोई और "मूल" विधि है, उदाहरण के लिए @Column(type="string", default="hello default value")

/**
 * @Entity @Table(name="posts") @HasLifeCycleCallbacks
 */
class Post implements Node, \Zend_Acl_Resource_Interface {

...

/**
 * @PrePersist
 */
function onPrePersist() {
    // set default date
    $this->dtPosted = date('Y-m-d H:m:s');
}

यदि आप अपनी इकाई के लिए yaml परिभाषा का उपयोग करते हैं, तो निम्न पोस्टग्रेस्क्ल डेटाबेस पर मेरे लिए निम्न कार्य करता है:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: boolean
            nullable: false
            options:
                default: false

संपत्ति परिभाषा पर डिफ़ॉल्ट मान सेट करते समय सावधान रहें! इसे समस्या मुक्त रखने के लिए, इसके बजाय इसे कन्स्ट्रक्टर में करें। यदि आप इसे संपत्ति परिभाषा पर परिभाषित करते हैं, तो ऑब्जेक्ट को डेटाबेस पर जारी रखें, फिर आंशिक लोड करें, फिर लोड नहीं किए गए गुणों का फिर से डिफ़ॉल्ट मान होगा। यदि आप ऑब्जेक्ट को फिर से जारी रखना चाहते हैं तो यह खतरनाक है।


डेटाबेस डिफ़ॉल्ट मान "पोर्टेबल" समर्थित नहीं हैं। डेटाबेस डिफ़ॉल्ट मानों का उपयोग करने का एकमात्र तरीका columnDefinition मैपिंग विशेषता के माध्यम से है जहां आप कॉलम के लिए SQL स्निपेट ( DEFAULT कारण समावेशी) निर्दिष्ट करते हैं।

आप उपयोग कर सकते हैं:

<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}

PHP-स्तर के डिफ़ॉल्ट मानों को प्राथमिकता दी जाती है क्योंकि ये नव निर्मित और बनाए गए ऑब्जेक्ट्स पर भी ठीक से उपलब्ध हैं (डिफ़ॉल्ट मान प्राप्त करने के लिए नई ऑब्जेक्ट को जारी रखने के बाद सिद्धांत डेटाबेस पर वापस नहीं जाएंगे)।





doctrine2