【问题标题】:How can i decode json data if i saved in array laravel?如果我保存在数组 laravel 中,如何解码 json 数据?
【发布时间】:2019-06-06 03:43:47
【问题描述】:

我有 2 张两张桌子:一张是录取表,另一张是班级表。我正在通过json_encode方法将班级ID保存在录取表的录取班级字段中。

我的控制器

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'
    ];
}

【问题讨论】:

  • 我看不到您的输入,但看起来您正在保存键而不是原始数组的值
  • $inputs 未在您的 store() 方法中定义。
  • 我假设你有一个AdmissionClass 模型。你也可以给我们看看吗?
  • 对不起,我忘了添加,$inputs = $request->all();,是的,我保存的是键而不是值,它以这种格式保存 ['"2",'"1 ",'"3",'"4",] 但我想以这种格式显示 Nursery,Class 1, Class2, Class3 等
  • 类录取扩展可验证{ protected $table = 'admissions';公共函数 School() { return $this->belongsTo('App\School','school_id'); } }

标签: laravel laravel-5 laravel-5.2 laravel-5.1


【解决方案1】:

您需要将整数值保存为 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()]);
  }

我还没有检查代码希望这能帮助你继续......

【讨论】:

  • 我不明白先生您发给我的方式。我所做的方式不正确,如果是,请指导我
【解决方案2】:

实现这一点的最佳方法是与App\Classes 建立一对多关系。

但是,既然您已经启动并运行了一些东西,我可能会这样做。

首先,我将admission_classes 转换为一个数组。这确保了 admission_classes 在获取时总是被强制转换为一个数组。它使我们更容易使用它。

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

最后,在获取录取记录时,您还需要对其进行映射并从其 id 中提取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); 

【讨论】:

  • 按照你说的做了,但是这个错误来了 调用未定义的方法 Illuminate\Database\Query\Builder::map()
  • 忘了最后有一个分页。编辑了我的答案,你可以试试这个吗?
  • 先生,我可以要您的电子邮件地址吗,先生,我需要您的帮助
  • $admissions = Admission::where('school_id',$school_id) ->orderBy('id','desc') ->paginate(10) ->map(function($admission) { return array_map(function($class) { return optional(Classes::find($class))->name; }, $admission->admission_classes); });这是错误调用未定义函数 App\Http\Controllers\optional()
  • optional() 在 Laravel 5.6 中添加。您可能运行的是早期版本,在这种情况下,您可以尝试我更新的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多