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 只得到 idprod_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)先看看它是什么。