langColumnsJson(); foreach ($columns as $v) { if (! isset($casts[$v])) { $casts[$v] = 'json'; } } return $casts; } public function getLangsToStringJsonJson() { return $this->langsToStringJson; } public function getLangsToStringOpts() { $locale = bff::locale(); if (method_exists($this, 'langDefault')) { $lang = $this->langDefault(); } else { $lang = bff::adminPanel() ? $locale->getAdminLocale() : $locale->getCurrentLanguage(); } return array_merge([ 'lang' => $lang, 'def' => $locale->getDefaultLanguage(), ], $this->langsToStringOpts); } /** * @param EloquentBuilder $query * @param array $fields * @param array $opts */ public function scopeLangJsonToString($query, $fields = [], $opts = []) { if (empty($fields)) { $fields = $this->langColumnsJson(); } elseif (is_string($fields)) { if (in_array($fields, $this->langColumnsJson())) { $fields = [$fields]; } else { $fields = []; } } $this->langsToStringJson = $fields; if (! empty($opts)) { $this->langsToStringOpts = $opts; } } /** * @var \Illuminate\Database\Eloquent\Collection $collection * @return \Illuminate\Database\Eloquent\Collection|static[] */ public function jsonLangsMapCollectionGet($collection) { do { $fields = $this->getLangsToStringJsonJson(); if (empty($fields)) { break; } $opts = $this->getLangsToStringOpts(); $collection = $collection->map(function ($item) use ($fields, $opts) { foreach ($fields as $v) { if (isset($item[$v]) && is_array($item[$v])) { if (isset($item[$v][ $opts['lang'] ])) { $item[$v] = $item[$v][ $opts['lang'] ]; } else { if (isset($item[$v][ $opts['def'] ])) { $item[$v] = $item[$v][ $opts['def'] ]; } else { $item[$v] = $item[$v][array_key_first($item[$v])]; } } } } return $item; }); } while (false); return $collection; } /** * @var \Illuminate\Database\Eloquent\Collection $collection * @param string $column * @return \Illuminate\Database\Eloquent\Collection|static[] */ public function jsonLangsMapCollectionPluck($collection, $column) { do { if (empty($column)) { break; } $fields = $this->getLangsToStringJsonJson(); if (empty($fields)) { break; } if (! in_array($column, $fields)) { break; } $opts = $this->getLangsToStringOpts(); $collection = $collection->map(function ($item) use ($opts) { if (is_array($item)) { if (isset($item[ $opts['lang'] ])) { $item = $item[ $opts['lang'] ]; } else { if (isset($item[ $opts['def'] ])) { $item = $item[ $opts['def'] ]; } else { $item = reset($item); } } } return $item; }); } while (false); return $collection; } }