ألن يكون رائعًا لو كان بإمكانك الحصول على القليل من روح NoSQL المتوفرة في Eloquent؟ هذه الحزمة تفعل ذلك تماما. يوفر سمة تسمح لك، عند تطبيقها على نموذج، بتخزين قيم عشوائية في عمود JSON واحد.
وهنا بعض الأمثلة. نحن نستخدم العمود extra_attributes
هنا، ولكن يمكنك تسميته كما تريد.
// add and retrieve an attribute
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // returns 'value'
// you can also use the array approach
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ] // returns 'value'
// setting multiple values in one go
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ]
];
// setting/updating multiple values in one go via set()
$ yourModel -> extra_attributes -> set ([
' han ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ]
]);
// retrieving values using dot notation
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // returns 'light'
// retrieve default value when attribute is not exists
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // returns 'default'
// it has a modelScope to retrieve all models with the given schemaless attributes
$ yourModel -> withSchemalessAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
// delete key & value
$ yourModel -> extra_attributes -> forget ( ' key ' );
نحن نستثمر الكثير من الموارد في إنشاء أفضل الحزم مفتوحة المصدر في فئتها. يمكنك دعمنا عن طريق شراء أحد منتجاتنا المدفوعة.
نحن نقدر بشدة إرسالك لنا بطاقة بريدية من مسقط رأسك، مع ذكر الحزمة (الحزم) التي تستخدمها. ستجد عنواننا على صفحة الاتصال لدينا. ننشر جميع البطاقات البريدية المستلمة على جدار البطاقات البريدية الافتراضية لدينا.
تتطلب هذه الحزمة قاعدة بيانات تدعم أعمدة json
مثل MySQL 5.7 أو أعلى.
بالنسبة للإصدارين 6 و7 من Laravel أو PHP 7، استخدم الإصدار 1.x من هذه الحزمة.
يمكنك تثبيت الحزمة عبر الملحن:
composer require spatie/laravel-schemaless-attributes
سيتم تخزين السمات غير المخططة في عمود json في جدول النموذج الخاص بك. دعونا نضيف هذا العمود ونجهز النموذج.
أضف ترحيلًا لجميع النماذج التي تريد إضافة سمات بدون مخطط إليها. يجب عليك استخدام طريقة schemalessAttributes
في Blueprint
لإضافة عمود. الوسيطة التي تقدمها إلى schemalessAttributes
هي اسم العمود الذي سيتم إضافته. يمكنك استخدام أي اسم تريد. لديك أيضًا الحرية في إضافة أي عدد تريده من أعمدة السمات غير المخططة إلى جدولك. في جميع أمثلة هذا الملف التمهيدي، سنستخدم عمودًا واحدًا يسمى extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
لكي تتمكن من العمل مع السمات غير المخططة، ستحتاج إلى إضافة طاقم عمل مخصص ونطاق على النموذج الخاص بك. فيما يلي مثال لما تحتاج إلى إضافته إذا اخترت extra_attributes
كاسم العمود الخاص بك.
use Illuminate Database Eloquent Model ;
use Illuminate Database Eloquent Builder ;
use Spatie SchemalessAttributes Casts SchemalessAttributes ;
class TestModel extends Model
{
// ...
public $ casts = [
' extra_attributes ' => SchemalessAttributes::class,
];
public function scopeWithExtraAttributes (): Builder
{
return $ this -> extra_attributes -> modelScope ();
}
// ...
}
إذا كنت بحاجة إلى دعم لعدة أعمدة بدون مخطط في نموذج واحد، فيجب عليك استخدام سمة SchemalessAttributesTrait
. فيما يلي مثال لما تحتاج إلى إضافته إذا اخترت extra_attributes, other_extra_attributes
كأسماء أعمدتك.
use Illuminate Database Eloquent Model ;
use Illuminate Database Eloquent Builder ;
use Spatie SchemalessAttributes SchemalessAttributes ;
use Spatie SchemalessAttributes SchemalessAttributesTrait ;
class TestModel extends Model
{
use SchemalessAttributesTrait;
// ...
/**
* @var array
*/
protected $ schemalessAttributes = [
' extra_attributes ' ,
' other_extra_attributes ' ,
];
public function scopeWithExtraAttributes (): Builder
{
return $ this -> extra_attributes -> modelScope ();
}
public function scopeWithOtherExtraAttributes (): Builder
{
return $ this -> other_extra_attributes -> modelScope ();
}
// ...
}
إذا كنت تريد إعادة استخدام هذا السلوك عبر نماذج متعددة، فيمكنك اختيار وضع الوظيفة في سمة خاصة بك. إليك ما يمكن أن تبدو عليه هذه السمة:
namespace App Models Concerns ;
use Illuminate Database Eloquent Model ;
use Illuminate Database Eloquent Builder ;
use Spatie SchemalessAttributes Casts SchemalessAttributes ;
trait HasSchemalessAttributes
{
public function initializeHasSchemalessAttributes ()
{
$ this -> casts [ ' extra_attributes ' ] = SchemalessAttributes::class;
}
public function scopeWithExtraAttributes (): Builder
{
return $ this -> extra_attributes -> modelScope ();
}
}
هذه هي أسهل طريقة للحصول على السمات غير المخططة وتعيينها:
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
بدلا من ذلك يمكنك استخدام نهج المصفوفة:
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
يمكنك استبدال جميع السمات غير المخططة الموجودة عن طريق تعيين مصفوفة لها.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
يمكنك أيضًا اختيار استخدام get
و set
. الأساليب لديها دعم لتدوين النقطة.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
يمكنك أيضًا تمرير قيمة افتراضية إلى طريقة get
.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
للاستمرار في السمات غير المخططة، يجب عليك، تمامًا كما تفعل مع السمات العادية، استدعاء save()
على النموذج.
$ yourModel -> save (); // Persists both normal and schemaless attributes
وإليك كيفية استخدام modelScope المقدم.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
إذا كنت تريد البحث فقط عن سمة مخصصة واحدة، فيمكنك استخدام modelScope مثل هذا
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
وأيضًا، إذا كنت تريد البحث فقط عن سمة مخصصة واحدة باستخدام عامل تشغيل مخصص، فيمكنك استخدام modelScope مثل هذا
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
إذا كنت تريد البحث فقط على سمة مخصصة متداخلة، فيمكنك استخدام modelScope مثل هذا
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
قم أولاً بإنشاء قاعدة بيانات MySQL باسم laravel_schemaless_attributes
. بعد ذلك يمكنك إجراء الاختبارات باستخدام:
composer test
الرجاء مراجعة سجل التغيير للحصول على مزيد من المعلومات حول ما تغير مؤخرًا.
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
يرجى مراجعة سياستنا الأمنية حول كيفية الإبلاغ عن الثغرات الأمنية.
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.