खोज…
परिचय
एलोकेंट एक ओआरएम (ऑब्जेक्ट रिलेशनल मॉडल) है जो लारवेल के साथ शामिल है। यह सक्रिय रिकॉर्ड पैटर्न को लागू करता है और रिलेशनल डेटाबेस के साथ बातचीत करने के लिए उपयोग किया जाता है।
टिप्पणियों
तालिका नामकरण
सम्मेलन का नाम मॉडल के लिए तालिका के नाम और विलक्षण "StudlyCase" के लिए बहुवचन "स्नेक_केस" का उपयोग करना है। उदाहरण के लिए:
- एक
cats
तालिका में एकCat
मॉडल होगा - एक
jungle_cats
टेबल में एकJungleCat
मॉडल होगा - एक
users
तालिका में एकUser
मॉडल होगा -
people
तालिका में एकPerson
मॉडल होगा
एलोकेंट स्वचालित रूप से आपके मॉडल को एक तालिका के साथ बांधने की कोशिश करेगा जिसमें मॉडल के नाम का बहुवचन है, जैसा कि ऊपर कहा गया है।
हालाँकि, आप डिफ़ॉल्ट कन्वेंशन को ओवरराइड करने के लिए एक टेबल का नाम निर्दिष्ट कर सकते हैं।
class User extends Model
{
protected $table = 'customers';
}
परिचय
सुवक्ता है ORM Laravel ढांचे में बनाया गया। यह ActiveRecord पैटर्न के उपयोग से आपको ऑब्जेक्ट-ओरिएंटेड तरीके से अपने डेटाबेस तालिकाओं के साथ बातचीत करने की अनुमति देता है।
एक एकल मॉडल वर्ग आमतौर पर एक ही डेटाबेस तालिका के लिए मैप करता है, और विभिन्न प्रकारों ( एक-से-एक , एक-से-कई , कई-से-कई , बहुरूपिक) के संबंधों को विभिन्न मॉडल कक्षाओं के बीच परिभाषित किया जा सकता है।
मॉडल बनाना अनुभाग मॉडल वर्गों के निर्माण और परिभाषा का वर्णन करता है।
इससे पहले कि आप एलोकेंट मॉडल का उपयोग शुरू कर सकें, सुनिश्चित करें कि कम से कम एक डेटाबेस कनेक्शन आपके config/database.php
कॉन्फ़िगर किया गया है।
विकास के दौरान एलोकेंट क्वेरी बिल्डर के उपयोग को समझने के लिए आप php artisan ide-helper:generate
उपयोग कर सकते हैं php artisan ide-helper:generate
कमांड php artisan ide-helper:generate
। यहाँ लिंक है ।
उप-विषय नेविगेशन
बने
एलोकेंट के साथ डेटा पढ़ने के अलावा, आप इसे save()
विधि के साथ डेटा डालने या अपडेट करने के लिए भी उपयोग कर सकते हैं। यदि आपने एक नया मॉडल उदाहरण बनाया है, तो रिकॉर्ड डाला जाएगा; अन्यथा, यदि आपने डेटाबेस से एक मॉडल को पुनः प्राप्त किया है और नए मान सेट किए हैं, तो इसे अपडेट किया जाएगा।
इस उदाहरण में हम एक नया User
रिकॉर्ड बनाते हैं:
$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();
आप डेटा की एक सरणी का उपयोग करके फ़ील्ड को पॉप्युलेट करने के लिए create
विधि का उपयोग कर सकते हैं:
User::create([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
अपनी विधि बनाने के दौरान अपने गुण को अपने मॉडल में fillable
सरणी में घोषित किया जाना चाहिए:
class User extends Model
{
protected $fillable = [
'first_name',
'last_name',
'email',
'password',
];
}
वैकल्पिक रूप से, यदि आप सभी विशेषताओं को बड़े पैमाने पर उपयोग करना चाहते हैं, तो आप $ संरक्षित संपत्ति को खाली सरणी के रूप में परिभाषित कर सकते हैं:
class User extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = [];
}
लेकिन क्या आप भी एक रिकार्ड के बिना भी बदल रहा है बना सकते हैं fillable
का उपयोग करके अपने मॉडल में विशेषता forceCreate
विधि के बजाय create
विधि
User::forceCreate([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
निम्नलिखित मौजूदा User
मॉडल को पहले लोड करके ( find
का उपयोग करके) अपडेट करने, इसे संशोधित करने और फिर इसे सहेजने का एक उदाहरण है:
$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();
एकल फ़ंक्शन कॉल के साथ समान उपलब्धि को पूरा करने के लिए, आप update
विधि का उपयोग कर सकते हैं:
$user->update([
'password' => bcrypt('my_new_password'),
]);
create
और update
तरीके व्यक्तिगत रूप से प्रत्येक कुंजी / मूल्य जोड़ी सेट करने की तुलना में डेटा के बड़े सेट के साथ काम करना आसान बनाते हैं, जैसा कि निम्नलिखित विवरण में दिखाया गया है:
नोट के उपयोग
only
औरexcept
जब अनुरोध डेटा एकत्र। यह महत्वपूर्ण है कि आप उन सटीक कुंजियों को निर्दिष्ट करें जिन्हें आप अपडेट करने की अनुमति देना / अस्वीकार करना चाहते हैं, अन्यथा किसी हमलावर के लिए उनके अनुरोध के साथ अतिरिक्त फ़ील्ड भेजना और अनपेक्षित अपडेट का कारण होना संभव है।
// Updating a user from specific request data
$data = Request::only(['first_name', 'email']);
$user->find(1);
$user->update($data);
// Create a user from specific request data
$data = Request::except(['_token', 'profile_picture', 'profile_name']);
$user->create($data);
हटाया जा रहा है
डेटाबेस में लिखने के बाद आप डेटा को हटा सकते हैं। आप या तो एक मॉडल उदाहरण को हटा सकते हैं यदि आपने एक को पुनः प्राप्त किया है, या किन शर्तों को हटाने के लिए रिकॉर्ड निर्दिष्ट करें।
मॉडल उदाहरण को हटाने के लिए, इसे पुनर्प्राप्त करें और delete()
विधि को कॉल करें:
$user = User::find(1);
$user->delete();
वैकल्पिक रूप से, आप उन रिकॉर्ड्स की प्राथमिक कुंजी (या प्राथमिक कुंजियों का एक सरणी) निर्दिष्ट कर सकते हैं जिन्हें आप destroy()
विधि से हटाना चाहते हैं:
User::destroy(1);
User::destroy([1, 2, 3]);
आप हटाने के साथ क्वेरी को भी जोड़ सकते हैं:
User::where('age', '<', 21)->delete();
यह उन सभी उपयोगकर्ताओं को हटा देगा जो शर्त से मेल खाते हैं।
नोट: एलोकेंट के माध्यम से बड़े पैमाने पर डिलीट स्टेटमेंट को निष्पादित करते समय,
deleting
deleted
औरdeleted
मॉडल ईवेंट को हटाए गए मॉडल के लिए निकाल नहीं दिया जाएगा। ऐसा इसलिए है क्योंकि डिलीट स्टेटमेंट को निष्पादित करते समय मॉडल वास्तव में कभी भी पुनर्प्राप्त नहीं किए जाते हैं।
मुलायम हटाना
कुछ बार आप किसी रिकॉर्ड को स्थायी रूप से हटाना नहीं चाहते हैं, लेकिन ऑडिट या रिपोर्टिंग उद्देश्यों के लिए इसे अपने पास रखें। इसके लिए, एलोकेंट सॉफ्ट डिलीटिंग कार्यक्षमता प्रदान करता है।
अपने मॉडल में SoftDeletes
को जोड़ने के लिए, आपको SoftDeletes
को इम्पोर्ट करना SoftDeletes
और इसे अपने SoftDeletes
मॉडल क्लास में जोड़ना होगा:
namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
मॉडल को हटाते समय, यह आपके मॉडल के लिए तालिका में deleted_at
टाइमस्टैम्प कॉलम पर टाइमस्टैम्प सेट करेगा, इसलिए पहले अपनी तालिका में deleted_at
कॉलम को बनाना सुनिश्चित करें। या माइग्रेशन में आपको deleted_at
टाइमस्टैम्प को जोड़ने के लिए अपने ब्लूप्रिंट पर softDeletes()
विधि को कॉल करना चाहिए। उदाहरण:
Schema::table('users', function ($table) {
$table->softDeletes();
});
कोई भी प्रश्न नरम हटाए गए रिकॉर्ड को छोड़ देगा। यदि आप withTrashed()
स्कोप का उपयोग करके आप उन्हें बल-प्रदर्शन कर सकते हैं:
User::withTrashed()->get();
यदि आप उपयोगकर्ताओं को सॉफ्ट-डिलीट करने के बाद एक रिकॉर्ड को पुनर्स्थापित करने की अनुमति देना चाहते हैं (यानी कचरा-प्रकार क्षेत्र में) तो आप restore()
विधि का उपयोग कर सकते हैं:
$user = User::find(1);
$user->delete();
$user->restore();
किसी रिकॉर्ड को जबरदस्ती हटाने के लिए forceDelete()
विधि का प्रयोग करें जो डेटाबेस से रिकॉर्ड को वास्तव में हटा देगा:
$user = User::find(1);
$user->forceDelete();
प्राथमिक कुंजी और टाइमस्टैम्प बदलें
डिफ़ॉल्ट रूप से, एलोकेंट मॉडल प्राथमिक कुंजी को 'id'
नाम देने की उम्मीद करते हैं। यदि वह आपका मामला नहीं है, तो आप अपनी प्राथमिक कुंजी का नाम $primaryKey
प्रॉपर्टी निर्दिष्ट कर $primaryKey
हैं।
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
// ...
}
अब, आपकी प्राथमिक कुंजी (जैसे find
या findOrFail
) का उपयोग find
वाले कोई भी findOrFail
इस नए नाम का उपयोग करेंगे।
इसके अतिरिक्त, एलोकेंट प्राथमिक कुंजी को एक ऑटो-इंक्रीमेंटिंग पूर्णांक होने की उम्मीद करता है। यदि आपकी प्राथमिक कुंजी एक ऑटो-इन्क्रिमेंटिंग पूर्णांक नहीं है (उदाहरण के लिए एक GUID), तो आपको $incrementing
संपत्ति को false
से अपडेट करके Eloquent को बताने की आवश्यकता है:
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
public $incrementing = false;
// ...
}
डिफ़ॉल्ट रूप से, Eloquent आपके टेबल पर मौजूद created_at
और updated_at
कॉलम की अपेक्षा करता है। यदि आप नहीं चाहते हैं कि ये कॉलम स्वचालित रूप से एलोक्वेंट द्वारा प्रबंधित हों, तो अपने मॉडल पर $timestamps
संपत्ति को गलत पर सेट करें:
class Citizen extends Model
{
public $timestamps = false;
// ...
}
यदि आपको टाइमस्टैम्प को संग्रहीत करने के लिए उपयोग किए जाने वाले कॉलम के नाम को अनुकूलित करने की आवश्यकता है, तो आप अपने मॉडल में CREATED_AT
और UPDATED_AT
स्थिरांक सेट कर सकते हैं:
class Citizen extends Model
{
const CREATED_AT = 'date_of_creation';
const UPDATED_AT = 'date_of_last_update';
// ...
}
यदि इकाई नहीं मिली तो 404 फेंक दें
यदि आप किसी रिकॉर्ड को खोजते समय स्वचालित रूप से एक अपवाद को फेंकना चाहते हैं जो कि एक मोडल पर नहीं मिला है, तो आप या तो उपयोग कर सकते हैं
Vehicle::findOrFail(1);
या
Vehicle::where('make', 'ford')->firstOrFail();
यदि 1
की प्राथमिक कुंजी के साथ एक रिकॉर्ड नहीं मिला है, तो एक ModelNotFoundException
को फेंक दिया जाता है। जो मूल रूप से लेखन ( स्रोत देखें ) के समान है:
$vehicle = Vehicle::find($id);
if (!$vehicle) {
abort(404);
}
क्लोनिंग मॉडल
आप अपने आप को एक पंक्ति क्लोन करने की आवश्यकता पा सकते हैं, शायद कुछ विशेषताओं को बदल सकते हैं लेकिन आपको चीजों को रखने के लिए एक कुशल तरीके की आवश्यकता है। लारवेल आपको इस कार्यक्षमता को करने की अनुमति देने के लिए एक तरह का 'छिपा हुआ' तरीका प्रदान करता है। हालांकि यह पूरी तरह से अनिर्दिष्ट है, आपको इसे खोजने के लिए एपीआई के माध्यम से खोज करने की आवश्यकता है।
$model->replicate()
का उपयोग करके आप आसानी से एक रिकॉर्ड क्लोन कर सकते हैं
$robot = Robot::find(1);
$cloneRobot = $robot->replicate();
// You can add custom attributes here, for example he may want to evolve with an extra arm!
$cloneRobot->arms += 1;
$cloneRobot->save();
ऊपर एक रोबोट मिलेगा जिसमें 1 की आईडी है, फिर इसे क्लोन करता है।