คงจะดีไม่น้อยหากคุณมีจิตวิญญาณของ 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 หรือสูงกว่า
สำหรับ Laravel เวอร์ชัน 6 & 7 หรือ PHP 7 ให้ใช้เวอร์ชัน 1.x ของแพ็คเกจนี้
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
composer require spatie/laravel-schemaless-attributes
แอตทริบิวต์แบบไม่มีสคีมาจะถูกจัดเก็บไว้ในคอลัมน์ json บนตารางโมเดลของคุณ มาเพิ่มคอลัมน์นั้นและเตรียมโมเดลกัน
เพิ่มการย้ายข้อมูลสำหรับโมเดลทั้งหมดที่คุณต้องการเพิ่มแอตทริบิวต์แบบไม่มีสคีมา คุณควรใช้เมธอด schemalessAttributes
บน Blueprint
เพื่อเพิ่มคอลัมน์ อาร์กิวเมนต์ที่คุณให้กับ schemalessAttributes
คือชื่อคอลัมน์ที่จะถูกเพิ่ม คุณสามารถใช้ชื่อใดก็ได้ที่คุณต้องการ คุณยังเพิ่มคอลัมน์แอตทริบิวต์แบบไม่มีสคีมาลงในตารางได้มากเท่าที่คุณต้องการอีกด้วย ในตัวอย่างทั้งหมดของ readme นี้ เราจะใช้คอลัมน์เดียวชื่อ 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'
คุณสามารถแทนที่แอตทริบิวต์ schemaless ที่มีอยู่ทั้งหมดได้โดยการกำหนดอาร์เรย์ให้กับแอตทริบิวต์นั้น
// 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'
หากต้องการคงคุณลักษณะ schemaless ไว้ คุณควรเรียก 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
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
โปรดตรวจสอบนโยบายความปลอดภัยของเราเกี่ยวกับวิธีการรายงานจุดอ่อนด้านความปลอดภัย
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม