Мой текущий API:
[{"id":43,"title_id":1,"user_id":1,"комментарий":"asdasddsa","сезон":null,"эпизод":null,"created_at":null,"updated_at": "2019-04-30 09:14:15"}]
Я хочу заменить user_id на данные пользователя из таблицы пользователей в соответствии с id. Я хотел бы видеть его таким:
[{"id":43,"title_id":1,"users":{id:"1",username:"test",email:"[email protected]"},"comment":"asdasddsa","season":null,"episode":null,"created_at":null,"updated_at":"2019-04-30 09:14:15"}]
Контроллер
public function index($id)
{
$test = Title::where('title_id', $id)->get();
return $test;
}
Название модели
public function user()
{
return $this->belongsTo('App\User', 'user_id');
}
protected $table = 'title';
если я использую foreach() в своем контроллере следующим образом:
$test = Title::where('title_id', $id)->get();
foreach($test as $details)
{
return $details->user->username;
}
Он получает сведения о пользователе, но его нет в API. Как я могу получить его в API?






Ты можешь это сделать:
$test= Title::where('title_id', $id)->get();
И если я правильно понимаю, на один титул приходится один пользователь, правильно? Затем вы можете сделать это, чтобы получить пользователя заголовка:
$test->user = User::find($test->user_id);
И, наконец, верните заголовок в ответ json:
return response()->json($test, 200);
Ваша спина пришлет то, что вы хотите, примерно так:
[{"id":43,"title_id":1,"users":{id:"1",username:"test",email:"[email protected]"},"comment":"asdasddsa","season":null,"episode":null,"created_at":null,"updated_at":"2019-04-30 09:14:15"}]
Для API лучше Красноречивый ресурс
Пример в вашем ресурсе Title будет выглядеть так:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Title extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'title_id' => $this->title_id,
'title_name' => $this->title_name,
'user_name' => $this->user->name,
];
}
public function with($request)
{
return [
'status' => '200',
'response' => 'Title resource',
];
}
}
В вашем контроллере
public function show(Title $title)
{
return new TitleResource($title);
}
В 5.4 будет так
public function show(Title $title)
{
$title->user_name = $title->user->name;
return $title->toJson();
}
и он должен работать нормально
пример в тинкере
>>> $user = App\User::find(1);
=> App\User {#3161
id: 1,
name: "superadmin",
email: "[email protected]",
created_at: "2018-12-13 12:09:07",
updated_at: "2018-12-22 06:47:13",
}
>>> $user->pk = 's';
=> "s"
>>> $user
=> App\User {#3161
id: 1,
name: "superadmin",
email: "[email protected]",
created_at: "2018-12-13 12:09:07",
updated_at: "2018-12-22 06:47:13",
pk: "s",
}
@IbrahimAldar проверьте документацию, вам не нужно писать ее вручную, она будет сгенерирована командой artisan, которая установит правильный путь для вашего приложения, после чего вы сможете настроить код внутри.
@IbrahimAldar Я обновил свой ответ, вы можете просто назначить имя своего пользователя как свойство текущего $title и вернуть его, все должно работать нормально.
JsonResource добавлен из laravel 5.6
@IbrahimAldar использует второй способ получения модели, добавляет преобразование свойства в json и возвращает его.
выглядит хорошо, но App\Http\Resources\JsonResource не найден