laravel - wyszukiwanie w polach z relacją typu JSON

0

Witajcie,
Mam problem z relacją z polem JSON.

Mam 3 relacje:

  • products

  • feature products

  • feature_values

Oraz tabele:

Migracjer:

Product:


    class Product extends Model implements Presentable
    {
    ....
    public function featureProducts()
        {
           return $this->hasMany(FeatureProduct::class, 'product_id');
            //return $this->belongsToMany(Feature::class, 'feature_product', 'id');
        }
    }


FeatureProduct


    class FeatureProduct extends Model
    {
        protected $table = "feature_product";
    
        protected $with = [
            'values'
        ];
    
        public function values()
        {
            return $this->belongsTo(FeatureValue::class, 'feature_values_ids', 'id');
        }
    
    }

FeatureValues:


    class FeatureValue extends Model
    {
        use SoftDeletes,
            Translatable;
    
        protected $fillable = [
            'feature_id',
            'value'
        ];
    
        protected $dates = [
            'created_at',
            'updated_at',
            'deleted_at'
        ];
    
        protected $translatable = [
            'value'
        ];
    
        public function feature(): BelongsTo
        {
            return $this->belongsTo(Feature::class);
        }
    
        public function getAdminUrlAttribute(): AbstractAdminUrlPresenter
        {
            return new FeatureValueUrlPresenter($this);
        }
    }

Problem jest z wyszukiwaniem w json: feature_product. feature_values_ids

Kiedy mam normalne liczby, relacja działa poprawnie:


    public function values()
        {
            return $this->belongsTo(FeatureValue::class, 'feature_values_ids', 'id');
        }

Problem jest z json:

["1", "2","3"]

Nie mam żadnych wyników :(

W jaki sposób mogę to naprawić?

0

Musisz użyć natywnego SQL-a zawierającego funkcje do przeszukiwania JSON.

Chyba, że Laravel takowe posiada, ale wątpię, bo w każdej bazie jest to dość indywidualnie rozwiązane.

Co więcej np. w PostrgeSQLu są problemy nawet na poziomie PDO, kiedy chcemy używać operatora ?, wtedy trzeba niestety posłużyć się pełnymi nazwami funkcji.

Widzę, że to chyba jest MySQL, więc:

https://dev.mysql.com/doc/refman/8.0/en/json-functions.html

Nie znam ORM Laravela, ale być może, tak jak np.w Phalconie, można zarejestrować własne funkcje SQL i ich używać w ORM, wtedy po prostu rejestrujesz / używasz funkcje JSON MySQL-a przy budowaniu zapytania w ORM.

1

https://laravel.com/docs/8.x/queries#json-where-clauses

Musiałbyś napisać jakiegoś własnego wrapera na relacje. Nie polecam. Może rozwiąż to jakaś tabelą pośrednicząca i innym typem relacji.

0

Chcesz powiedzieć, że trzymasz pole JSON i tam ma być id z relacja do innej tabeli ? czyli kilka tych id ? dobrze rozumiem ?

0

A daj jakiś przykład jak to wygląda z poziomu bazy danych, bo nie wiem czy dobrze rozumiemy. Przykładowy wiersz z bazy z tym jsonem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1