Как я могу декодировать данные JSON, если я сохранил в массиве Laravel? - PullRequest
0 голосов
/ 11 января 2019

У меня есть две таблицы: одна - входная, а другая - таблица классов. Я сохраняю идентификатор класса в поле класса доступа таблицы допуска методом json_encode.

Мой контроллер

public function store(Request $request)
{
         $inputs = $request->all();

    $admission = new Admission;
    $admission->school_id = Auth::User()->id;
    $admission->admission_classes=json_encode($inputs['admission_classes']);
    $admission->save();   

}

Моя индексная функция

public function index(Request $request) {

    $school_id= Auth::user()->id;

    $admissions= Admission::where('school_id',$school_id)->orderBy('id','desc')->paginate(10);
    return view('frontend.index',compact('admissions','active_class'));

}

Мой взгляд

@foreach($admissions as $i => $admission)

  {{ $admission->admission_classes }}

@endforeach

Я получаю данные следующим образом: -

["1","2","4","5","6","7","8","9"]   

Но я хочу получить в этом формате:

Nursery,Class 1, Class2, Class3 etc

My class controller
class Classes extends Authenticatable
{
    use EntrustUserTrait;
    use Billable;
    use Messagable;
  
    protected $fillable = [
	'name','status'
    ];
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вам нужно сохранить целочисленное значение в виде массива json и выполнить следующий код

$integerIDs = array_map('intval',  $inputs['admission_classes']);
 $admission->admission_classes= json_encode($integerIDs);   

 public function index(Request $request){
    $admissions = DB::select('SELECT a.*, GROUP_CONCAT(c.name) as classes FROM academy as a LEFT JOIN class c ON JSON_CONTAINS(a.classes, CAST(c.id as JSON), '$') WHERE a.school_id =2 GROUP BY a.id');

    $admissions = $this->arrayPaginator($admissions, $request);

    return view('frontend.index',compact('admissions','active_class'));
 }

 public function arrayPaginator($array, $request)
 {
       $page = Input::get('page', 1);
       $perPage = 10;
       $offset = ($page * $perPage) - $perPage;
       return new LengthAwarePaginator(array_slice($array, $offset, 
         $perPage, true), count($array), $perPage, $page,
            ['path' => $request->url(), 'query' => $request->query()]);
  }

Я не проверял код, надеюсь, это поможет вам продолжить .......

0 голосов
/ 11 января 2019

Лучший способ достичь этого - иметь отношения один-ко-многим с App\Classes.

Однако, так как у вас уже есть что-то и работает, я, вероятно, сделал бы это так

Во-первых, я бы преобразовал admission_classes в массив. Это гарантирует, что admission_classes всегда будет приводиться к массиву всякий раз, когда он выбирается. Нам легче с ним работать.

protected $casts = [
    'admission_classes' => 'array'
]; 

Наконец, при извлечении ваших записей о поступлении вам также необходимо нанести на карту карту и гидрировать Classes из его идентификаторов. Вот как я бы попытался этого добиться.

$admissions = Admission::where('school_id',$school_id)
    ->orderBy('id','desc')
    ->paginate(10)
    ->map(function($admission) {
        return array_map(function($class) {
            $class = Classes::find($class); 
            return isset($class) ? $class->name : ''; 
        }, $admission->admission_classes); 
    });

Вы заметите, что я обернул метод Classes::find() в помощник optional(). Это потому, что в случае, если запись не найдена, она не подведет.

Наконец, чтобы напечатать имена ваших классов в вашем блейде, вы должны сделать что-то вроде этого:

implode(',', $admission->admission_classes); 
...