আমি কীভাবে মতবাদ 2 এ একটি ডিফল্ট মান সেট করব?
আমি কীভাবে মতবাদ 2 এ একটি ডিফল্ট মান সেট করব?
উত্তর:
ডাটাবেস ডিফল্ট মানগুলি "বহনযোগ্য" সমর্থিত নয়। ডাটাবেস ডিফল্ট মানগুলি ব্যবহার করার একমাত্র উপায় হ'ল columnDefinition
ম্যাপিং অ্যাট্রিবিউটের মাধ্যমে যেখানে আপনি কলামটির জন্য SQL
স্নিপেট ( DEFAULT
কারণ সহ) নির্দিষ্ট করেছেন ক্ষেত্রটি ম্যাপ করা হয়েছে।
তুমি ব্যবহার করতে পার:
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
পিএইচপি-স্তরের ডিফল্ট মানগুলিকে অগ্রাধিকার দেওয়া হয় কারণ এগুলি সদ্য নির্মিত এবং স্থির অবজেক্টগুলিতে যথাযথভাবে উপলভ্য হয় (ডিফল্ট মানগুলি পেতে কোনও নতুন অবজেক্ট ধরে রাখার পরে মতবাদ ডাটাবেসে ফিরে যাবে না)।
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
*/
private $myColumn;
...
}
নোট করুন যে এটিতে এসকিউএল ব্যবহার করা হয় DEFAULT
যা কিছু ক্ষেত্রের মতো BLOB
এবং এর জন্য সমর্থিত নয় TEXT
।
options={"default": 0}
"এবং না" ব্যবহারে সতর্ক থাকুন কারণ এটি আমার মতবাদের সংস্করণে ত্রুটি সৃষ্টি করে
আপনার সত্তায় একটি কনস্ট্রাক্টর সেট আপ করুন এবং সেখানে ডিফল্ট মান সেট করুন।
ব্যবহার করুন:
options={"default":"foo bar"}
এবং না:
options={"default"="foo bar"}
এই ক্ষেত্রে:
/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
সিমফনির জন্য ডকুমেন্টেশন পড়ার আরও একটি কারণ কখনই প্রবণতার বাইরে যাবে না। আমার নির্দিষ্ট কেসের জন্য একটি সহজ সমাধান আছে এবং এটি একটি ডিফল্ট মানটিতে field type
বিকল্প সেট করা empty_data
।
আবার, এই সমাধানটি কেবল সেই দৃশ্যের জন্য যেখানে কোনও ফর্মের খালি ইনপুটটি ডিবি ক্ষেত্রটি বাতিল করে দেয়।
পূর্ববর্তী উত্তরগুলির মধ্যে আমার সুনির্দিষ্ট দৃশ্যে আমার কোনও সহায়তা হয়নি তবে আমি একটি সমাধান পেয়েছি।
আমার একটি ফর্ম ক্ষেত্র ছিল যা নিম্নলিখিত হিসাবে আচরণ করা দরকার:
আমি তখন এখানে দেওয়া সমস্ত সুপারিশ চেষ্টা করেছিলাম। আমাকে তাদের তালিকা করতে দিন:
<?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->isValid()
পদ্ধতির অভ্যন্তরে default ডিফল্ট মানগুলি আপনার 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->setData()
বিশদে অনুসন্ধান করুন)।
আমি যে ওয়ার্কারআউন্ডটি ব্যবহার করছিলাম তা ছিল a 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');
}
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
আপনি এটি এক্সএমএল ব্যবহার করেও করতে পারেন:
<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>
আমি নিজের জন্য এটি কীভাবে সমাধান করেছি তা এখানে। নীচে মাইএসকিউএল এর জন্য ডিফল্ট মান সহ একটি সত্তার উদাহরণ দেওয়া আছে। তবে এটির জন্য আপনার সত্তায় কোনও কনস্ট্রাক্টর সেটআপ করা দরকার এবং আপনার সেখানে ডিফল্ট মান সেট করতে হবে।
Entity\Example:
type: entity
table: example
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
label:
type: string
columnDefinition: varchar(255) NOT NULL DEFAULT 'default_value' COMMENT 'This is column comment'
columnDefinition
সরাসরি একটি ORM থাকার উদ্দেশ্যটির পুনরুদ্ধার করে, যা ডাটাবেস থেকে বিমূর্ততা। এই সমাধানটি বহনযোগ্যতা ভঙ্গ করবে, আপনার ডিবি বিক্রেতার উপর আপনার সফ্টওয়্যার নির্ভর করবে এবং ডক্ট্রাইন মাইগ্রেশন সরঞ্জামগুলিও ভেঙে দেবে।
আমার জন্য একটি মাইএসকিএল ডাটাবেসেও কাজ করে:
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: integer
nullable: true
options:
default: 1
এর কোনওটিই আমার পক্ষে কাজ করেনি। আমি মতবাদের সাইটে এমন কিছু ডকুমেন্টেশন পেয়েছি যেগুলিতে একটি ডিফল্ট মান সেট করতে সরাসরি মান সেট করতে বলে।
private $default = 0;
এটি আমার চাইবার মানটি প্রবেশ করিয়েছে।
উজ্জ্বল উত্তর @ রোমানব যোগ করা।
এটি মাইগ্রেশনে সামান্য ওভারহেড যুক্ত করে, কারণ আপনি স্পষ্টতই নাল বাধা ছাড়াই এবং কোনও ডিফল্ট মান ছাড়াই কোনও ক্ষেত্র তৈরি করতে পারবেন না।
// 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");
এই উত্তরটির সাথে, আমি আপনাকে ভাবতে উত্সাহিত করি কেন প্রথমে আপনার ডাটাবেসে ডিফল্ট মান প্রয়োজন? এবং সাধারণত এটি নাল বাধা না দিয়ে বস্তু তৈরি করার অনুমতি দেওয়া হয়।
আপনি যদি আপনার সত্তার জন্য ইয়ামল সংজ্ঞা ব্যবহার করেন তবে নিম্নলিখিতটি পোস্টগ্রেসকিএল ডাটাবেসে আমার জন্য কাজ করে:
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: boolean
nullable: false
options:
default: false
$entity->setFieldName()
ফ্লাশিংয়ের আগে ব্যবহার না করেন ? মতবাদটি নালার ডিফল্ট মান সংজ্ঞায়িত করে বলে মনে হচ্ছে। Yaml মধ্যে একমাত্র সমাধান ডিফল্ট মান নির্ধারণ করতে হয় ইন সত্তা বর্গ যা আমার বোবা বলে মনে হয় যেহেতু এটি ইতিমধ্যে yaml সংজ্ঞায়িত হয়েছে তা ... -_-
আমি একই সমস্যা নিয়ে লড়াই করেছি। সত্তা (স্বয়ংক্রিয়ভাবে) ডাটাবেস থেকে ডিফল্ট মান পেতে চাই। অনুমান করুন, আমি এটা করেছি :)
<?php
/**
* Created by JetBrains PhpStorm.
* User: Steffen
* Date: 27-6-13
* Time: 15:36
* To change this template use File | Settings | File Templates.
*/
require_once 'bootstrap.php';
$em->getConfiguration()->setMetadataDriverImpl(
new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
)
);
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager());
$driver->setNamespace('Models\\');
$em->getConfiguration()->setMetadataDriverImpl($driver);
$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();
// Little hack to have default values for your entities...
foreach ($metadata as $k => $t)
{
foreach ($t->getFieldNames() as $fieldName)
{
$correctFieldName = \Doctrine\Common\Util\Inflector::tableize($fieldName);
$columns = $tan = $em->getConnection()->getSchemaManager()->listTableColumns($t->getTableName());
foreach ($columns as $column)
{
if ($column->getName() == $correctFieldName)
{
// We skip DateTime, because this needs to be a DateTime object.
if ($column->getType() != 'DateTime')
{
$metadata[$k]->fieldMappings[$fieldName]['default'] = $column->getDefault();
}
break;
}
}
}
}
// GENERATE PHP ENTITIES!
$entityGenerator = new \Doctrine\ORM\Tools\EntityGenerator();
$entityGenerator->setGenerateAnnotations(true);
$entityGenerator->setGenerateStubMethods(true);
$entityGenerator->setRegenerateEntityIfExists(true);
$entityGenerator->setUpdateEntityIfExists(false);
$entityGenerator->generate($metadata, __DIR__);
echo "Entities created";
কনস্ট্রাক্টরটিতে মান নির্ধারণের সময় কাজ করা হবে, ডক্ট্রাইন লাইফাইসাইকেল ইভেন্টগুলি ব্যবহার করা আরও ভাল সমাধান হতে পারে।
উপজীব্য করে prePersist
লাইফ সাইকল ইভেন্ট, আপনি শুধুমাত্র প্রাথমিক জিদ আপনার সত্তা উপর আপনার ডিফল্ট মান সেট পারে।
hack
। হ্যাকগুলির উপর কখনই ভরসা করবেন না।
সম্পত্তি সংজ্ঞা উপর ডিফল্ট মান সেট করার সময় সাবধান! এটিকে সমস্যা-মুক্ত রাখতে পরিবর্তে এটি নির্মাণে করুন। যদি আপনি এটি সংজ্ঞা সংজ্ঞাতে সংজ্ঞায়িত করেন, তবে ডাটাবেসে অবজেক্টটি অবিরত রাখুন, তারপরে একটি আংশিক লোড করুন, তারপরে লোড না হওয়া বৈশিষ্ট্যের আবার ডিফল্ট মান থাকবে। আপনি যদি আবার অবজেক্টটি ধরে রাখতে চান তবে এটি বিপজ্জনক।