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 ' );
우리는 동급 최고의 오픈 소스 패키지를 만드는 데 많은 리소스를 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하고 있는 당사 패키지를 언급하면서 귀하의 고향에서 엽서를 보내주셔서 진심으로 감사드립니다. 연락처 페이지에서 주소를 확인하실 수 있습니다. 우리는 수신된 모든 엽서를 가상 엽서 월에 게시합니다.
이 패키지에는 MySQL 5.7 이상과 같은 json
열을 지원하는 데이터베이스가 필요합니다.
Laravel 버전 6 및 7 또는 PHP 7의 경우 이 패키지의 버전 1.x를 사용하세요.
작곡가를 통해 패키지를 설치할 수 있습니다.
composer require spatie/laravel-schemaless-attributes
스키마 없는 속성은 모델 테이블의 json 열에 저장됩니다. 해당 열을 추가하고 모델을 준비하겠습니다.
스키마 없는 속성을 추가하려는 모든 모델에 대한 마이그레이션을 추가합니다. 열을 추가하려면 Blueprint
에서 schemalessAttributes
메서드를 사용해야 합니다. 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 ();
먼저 laravel_schemaless_attributes
라는 MySQL 데이터베이스를 만듭니다. 그 후 다음을 사용하여 테스트를 실행할 수 있습니다.
composer test
최근 변경된 사항에 대한 자세한 내용은 변경 로그를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
보안 취약점을 보고하는 방법에 대한 보안 정책을 검토하세요.
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.