سلام
من میخوام در api به جای این که id جدول نمایش داده بشه یک hash از اون رو نشون بده
از getAttribute استفاده کردم ولی دیگه relationships ها کار نمی کنه !!!!
ممنون میشم کمک کنید
میتونی از Eloquent: API Resources استفاده کنی، کارشون اینه که قبل از اینکه اطلاعات رو برگردونی مشخص کنی چه ایتم ها با چه نوع برگردن
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class User extends JsonResource
{
/
Transform the resource into an array.
@param \Illuminate\Http\Request $request
@return array
/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
}
من باید تک تک فیلد ها رو بزارم ؟؟
تا جایی که میدونم بله باید همه اطلاعاتی که میخوای برگردونی بذاری تویی این ریسورس چون داری متد toArray رو override میکنی پس داده ای برنمگیرده به جز اطلاعات متد toArray.
اینم بگم میتونی همین متد toArray رو تویی مدلت استفاده کنی و نیازی به ریسورس نداری ولی ممکنه شما به جز API از خود وبسایتی که با لاراول ساختی استفاده بکنی و اونجا به جای HASH ID ممکنه خود IDرو بخوای پس بهترین روش استفاده از Resource هستش
من همین الان تست کردم relationships به مشکل میخوره حتما باید اسم متد رو هم بزارم تا نشون بده اگه هم بزارم داخل همه در خواست ها نشون میده ی در خواست لیست کاربر های خالی بوک مارک هاشو هم میده !!!
بیشتر درباره relationships تون بگین ببینم کجا به مشکل برمیخوره، چطوری مینویسی که به مشکل برمیخوره؟!!
این مدل
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Vinkla\Hashids\Facades\Hashids;
class User extends Model
{
public function bookmarks()
{
return $this->belongsToMany('App\Place', 'bookmarks');
}
public function toArray()
{
return [
'id' => Hashids::connection(get_called_class())->encode($this->id),
'name' => $this->name,
'bookmarks' => $this->bookmarks
];
}
}
اینم ی در خواست تست
<?php
Route::post('/test', function () {
return App\User::all();
});
اینم نتیجه که همراه relationships نشون میده
[
{
"id": "4wOXMdWZGe",
"name": "رضا",
"bookmarks": [
{
"id": 1,
"name": "مکان شماره 1",
"phone": "11111111111",
"logo": "no-image-slide.webp",
"category_id": 2,
"deleted_at": null,
"created_at": "2020-03-09T18:27:58.000000Z",
"updated_at": "2020-03-09T18:27:58.000000Z",
"pivot": {
"user_id": 1,
"place_id": 1
}
}
]
},
{
"id": "G7DXxpXxbA",
"name": "سارا",
"bookmarks": []
},
{
"id": "pwQWBOX6v7",
"name": "علی",
"bookmarks": []
}
]
بوک مارک ها رو هم نشون میده ولی نباید اینطور باشه اگه هم نزارم تو در خواست زیر نشون نمیده بوک مارک ها رو
<?php
Route::post('/test', function () {
return App\User::with('bookmarks')->get();
});
برای بوکمارک هاتون user_id مشخص کردی؟!!
return $this->belongsToMany('App\Place', 'bookmarks', 'user_id');
متوجه نشدم منظورتون چیه ؟
ی جدول به اسم بوک مارک دارم فقط داخلش
user_id و place_id هست از این طریق بوک مارک های کاربر رو میگیرم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟