Laravel - 在数据库视图中显示 Array/String Object
Laravel - Display Array/String Object in view from database
数据在数据库中存储为 ["item_1", "item_2"]
,如下所示。
我想在视图 blade 中正确显示这些数据。
产品型号
protected $fillable = ['name', 'prod_id'];
public function models() {
return $this->hasMany(Model::class, 'prod_id');
}
模特模特
protected $fillable = ['model', 'prod_id'];
protected $cat = ['model'=>'array'];
public function model()
{
return $this->belongsTo(Product::class, 'prod_id');
}
控制器 - 存储方法
public function create (Request $request, Product $product){
$models = new Model;
{
$model = json_encode(request('models'));
$items->models = $model;
$product->models()->save($models);
}
}
控制器显示方法
public function show(request $id){
$product = Product::findorfail($id);
$models = Model::with(['model'])->where('prod_id', $product->id)->get();
return view ('show', compact('product', 'models'));
创建视图
<input type="checkbox" name="model[]" value="Samsung">
<input type="checkbox" name="model[]" value="Nokia">
<input type="checkbox" name="model[]" value="Apple">
<button>Add Model</button>
我试过显示视图:
@foreach($models as $model)
{{ json_decode($model->models) }}
@endforeach
它抛出
htmlspecialchars() expects parameter 1 to be string, array given
我错过了什么
PS: MySQL 不支持 json 列,所以我保存为文本列。
你需要做这样的事情。
模特模特
protected $fillable = ['models', 'prod_id']; // screenshot says that the field name is "models"
protected $cast = ['models' => 'array']; // the property is $cast no $cat
public function product()
{
return $this->belongsTo(Product::class, 'prod_id');
}
ModelController - 存储方法
public function store (Request $request){
$product = Model::create([
'models' => json_encode($request->models),
'prod_id' => $request->prod_id
]);
return redirect()->back()->with('success', 'created!');
}
public function show(Request $id){
$model = Model::findOrFail($id)->with('product');
return view ('model.show', compact('model'));
}
ProductController 显示方法
public function show(request $id){
$product = Product::findOrFail($id)->with('models'); // the method name is findOrFail() no findorfail
// $models = Model::with(['model'])->where('prod_id', $product->id)->get();
return view ('show', compact('product'));
}
进入节目查看
@foreach($product->models as $models)
@foreach(json_decode($models->models) as $model)
{{ $model }}
@endforeach
@endforeach
您需要像这样更改您的 foreach:
@foreach($models->models as $model)
{{ json_decode($model) }}
@endforeach
因为你的数组是这样的
{"id":18,"prod_id":22,"models":{"id":22,"user_id":1}}
这里的 $models
只得到 id
而 prod_id
models
仍然是数组所以你的 foreach 应该是 @foreach($models->models as $model)
示例代码在这里:
$arr = '{"id":18,"prod_id":22,"models":{"id":22,"user_id":1}}';
echo '<pre>';
foreach (json_decode($arr->models) as $str){
echo $str;
}
你的 Models 模型让我有点困惑。您似乎有一个与关系方法名称相同的字段名称 model
。这意味着无论何时您包含该关系,它都会在功能上使用来自相关 table 的数据覆盖 属性。 (我说 'functionally' 是因为您使用的是动态属性,而实际上可以明确地告诉 Eloquent 您是否需要属性或关系而不用猜测。)
也就是说,您的 $model->models
属性 可能由于两个原因之一而作为数组返回。首先是它可能不小心引用了关系 data-set 而不是您期望的 JSON 字符串。第二个是您已将 protected $cat = ['model'=>'array'];
更正为 protected $cast = ['models'=>'array'];
,它现在正踩着您的脚趾。通过将它转换为一个数组,它可能会在你调用 json_decode
之前自动被解释回一个 。
不管怎样,我都会dd($model->models)
先看看它是什么。
数据在数据库中存储为 ["item_1", "item_2"]
,如下所示。
我想在视图 blade 中正确显示这些数据。
产品型号
protected $fillable = ['name', 'prod_id'];
public function models() {
return $this->hasMany(Model::class, 'prod_id');
}
模特模特
protected $fillable = ['model', 'prod_id'];
protected $cat = ['model'=>'array'];
public function model()
{
return $this->belongsTo(Product::class, 'prod_id');
}
控制器 - 存储方法
public function create (Request $request, Product $product){
$models = new Model;
{
$model = json_encode(request('models'));
$items->models = $model;
$product->models()->save($models);
}
}
控制器显示方法
public function show(request $id){
$product = Product::findorfail($id);
$models = Model::with(['model'])->where('prod_id', $product->id)->get();
return view ('show', compact('product', 'models'));
创建视图
<input type="checkbox" name="model[]" value="Samsung">
<input type="checkbox" name="model[]" value="Nokia">
<input type="checkbox" name="model[]" value="Apple">
<button>Add Model</button>
我试过显示视图:
@foreach($models as $model)
{{ json_decode($model->models) }}
@endforeach
它抛出
htmlspecialchars() expects parameter 1 to be string, array given
我错过了什么
PS: MySQL 不支持 json 列,所以我保存为文本列。
你需要做这样的事情。
模特模特
protected $fillable = ['models', 'prod_id']; // screenshot says that the field name is "models"
protected $cast = ['models' => 'array']; // the property is $cast no $cat
public function product()
{
return $this->belongsTo(Product::class, 'prod_id');
}
ModelController - 存储方法
public function store (Request $request){
$product = Model::create([
'models' => json_encode($request->models),
'prod_id' => $request->prod_id
]);
return redirect()->back()->with('success', 'created!');
}
public function show(Request $id){
$model = Model::findOrFail($id)->with('product');
return view ('model.show', compact('model'));
}
ProductController 显示方法
public function show(request $id){
$product = Product::findOrFail($id)->with('models'); // the method name is findOrFail() no findorfail
// $models = Model::with(['model'])->where('prod_id', $product->id)->get();
return view ('show', compact('product'));
}
进入节目查看
@foreach($product->models as $models)
@foreach(json_decode($models->models) as $model)
{{ $model }}
@endforeach
@endforeach
您需要像这样更改您的 foreach:
@foreach($models->models as $model)
{{ json_decode($model) }}
@endforeach
因为你的数组是这样的
{"id":18,"prod_id":22,"models":{"id":22,"user_id":1}}
这里的 $models
只得到 id
而 prod_id
models
仍然是数组所以你的 foreach 应该是 @foreach($models->models as $model)
示例代码在这里:
$arr = '{"id":18,"prod_id":22,"models":{"id":22,"user_id":1}}';
echo '<pre>';
foreach (json_decode($arr->models) as $str){
echo $str;
}
你的 Models 模型让我有点困惑。您似乎有一个与关系方法名称相同的字段名称 model
。这意味着无论何时您包含该关系,它都会在功能上使用来自相关 table 的数据覆盖 属性。 (我说 'functionally' 是因为您使用的是动态属性,而实际上可以明确地告诉 Eloquent 您是否需要属性或关系而不用猜测。)
也就是说,您的 $model->models
属性 可能由于两个原因之一而作为数组返回。首先是它可能不小心引用了关系 data-set 而不是您期望的 JSON 字符串。第二个是您已将 protected $cat = ['model'=>'array'];
更正为 protected $cast = ['models'=>'array'];
,它现在正踩着您的脚趾。通过将它转换为一个数组,它可能会在你调用 json_decode
之前自动被解释回一个 。
不管怎样,我都会dd($model->models)
先看看它是什么。