Представьте себе у меня есть несколько простых объектов, как это:Как переопределить результат hasMany отношений?
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function posts()
{
return $this->hasMany("App\Post");
}
}
class Post extends Model
{
public function user()
{
return $this->belongsTo("App\User");
}
}
Мы Произнесите \App\Post
объект имеет столбец базы данных под названием jsondata
, который содержит JSON-кодированные данные. Когда я хочу, чтобы отобразить сообщения пользователя в представлении с этим столбец декодируется, мне нужно сделать это в контроллере:
$posts = Auth::user()->posts()->get();
foreach ($posts as $post) {
$post->jsondata = json_decode($post->jsondata);
}
return view("user.show", ["posts"=>$posts]);
Есть ли способ избежать этого foreach
цикла в моем контроллере и сделать декодирование JSON в более низкий уровень?
Я уверен, что смогу сделать это в App\User::posts()
, но это не помогает в других местах, где мне нужно отображать декодированные данные. Я попытался определить App\Post::get()
, чтобы переопределить родительский метод, но он не работает, потому что hasMany()
, похоже, не возвращает экземпляр модели вообще.
Должно быть лучше или нет. Это зависит от того, хотите ли вы сохранить атрибут закодированных данных или нет. Laravel предоставляет вам много методов для выполнения одних и тех же вещей, не всегда лучший, но есть хорошие или плохие подходы к проблемам – Alessandro