数据以["item_1", "item_2"]
形式存储在数据库中,如下所示。
我想在视图刀片中正确显示这些数据。
产品型号
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()期望参数1为字符串,给定数组为
我错过了什么。
PS:MySQL不支持json列,所以我保存为文本列。
答案 0 :(得分:2)
你需要这样做。
模型模型
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 show method
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
答案 1 :(得分:2)
您的模型模型让我感到困惑。您似乎有一个与关系方法名称相同的字段名称model
。这意味着无论何时包含该关系,它都会在功能上使用相关表中的数据覆盖该属性。 (我说'功能'是因为你正在使用动态属性,而实际上可以明确告诉Eloquent你是否想要一个属性或关系,而不是猜测它。)
也就是说,由于两个原因之一,您的$model->models
属性可能会以数组的形式返回。第一个是它可能意外地引用了关系数据集而不是您期望的JSON字符串。第二个是你已经更正了protected $cat = ['model'=>'array'];
来阅读protected $cast = ['models'=>'array'];
,现在它正在踩到你的脚趾。通过将其强制转换为数组,可能会在上调用json_decode
之前自动将其解释回一个。
无论哪种方式,我都会dd($model->models)
看看它是什么。
答案 2 :(得分:0)
你需要像这样改变你的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;
}