سلام
من یک api با استفاده از passport روی لاراول پیاده سازی کردم، با استفاده از oauth/token میام و کاربرم رو لاگین میکنم، بعد یک route دارم شبیه به کد زیر:
Route::get('/getProfile', 'AuthController@profile')->middleware('auth:api');
و متد مربوطه به این route:
public function profile(){
$userProfile = auth('api')->user()->with('meta')->get();
return response()->json(['message' => $userProfile]);
}
طبیعتا این کد باید صرفا کاربر جاری که با استفاده از api و به روش فوق لاگین کرده رو نمایش بده اما میاد و کل کاربران رو واسم نمایش میده
نمیدونم چرا چنین اتفاقی افتاده، واسم منطقی نیست، کسی میتونه کمکی بده؟
مشکل که نیست.. این تفاوت عملکرد بین این ۲ متد هست
روابط در مدل های الکوئنت، در پشت صحنه از Join های بین جداول استفاده میکنند
نوع فراخوانی داده ها در متد های with و load با هم فرق میکنه
که این تفاوت باعث میشه نوع کوئری های متفاوتی ساخته و اجرا بشه
من جداول شما رو ندارم اما با رابطه بین User و Roles برات مثال میزنم:
اگر من بیام یه User رو پیدا کنم و با With بخواهم رابطه Roles رو بگیرم
یعنی چنین حالتی:
User::find(4)->with('roles')->get()
کوئری هایی که تولید میشند به شکل زیره:
"select * from `users` where `users`.`id` = 4 limit 1";
"select * from `users`";
"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) and `model_has_roles`.`model_type` = `App\User`"
من توی سیستمم کلا ۱۲ تا User دارم و میبینی که توی کوئری سوم داره whereIn روی هر ۱۲ تا کاربر زده میشه..
همچنین توی کوئری دوم هم داره تمام کاربرا رو میگیره
برای همین هم تمام کاربر ها رو برمیگردونه
حالا اگر از Load استفاده کنم:
User::find(4)->load('roles')
کوئری هایی که تولید میشند به شکل زیره:
"select count(*) as aggregate from `users`";
"select * from `users` where `users`.`id` = 4 limit 1";
"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (4) and `model_has_roles`.`model_type` = `App\User`";
اما این بار فقط یک آیدی توی whereIn داریم
با توجه به نوع کوئری هایی که اجرا میشه، چنین نتیجه ای کاملا منطقی هست
@ali.bayat
کلا اون قسمت with رو هم پاک کردم و به توصیه شما از load هم استفاده کردم ولی تاثیری نداشت و نتیجه به طرز عجیبی یکسانه!
$userProfile = auth('api')->user()->get();
بدون رابطه هم بازم کل کاربران رو برمیگردونه
نسخه لاراول 7.30 هست، میتونه مشکل از لاراول باشه؟
لطفا midleware روتر api رو مجددا بررسی کنید.
اگر مشکلی نداشت میتونید مقدار count کاربر تونو بگیرید.
اگر همه رو حساب کرد یعنی یا توو دیتابیس یا توو شرطتون ی باگ داره
@masterspyware
اینکارهارو به جز بررسی میدلور انجام دادم و در هر صورت تمام کاربران رو برمیگردونه
شرط خاصی هم اعمال نکردم! نمونه کدش رو بالا فرستادم
مگر اینکه پاسپورت روشی برای احراز هویت کاربر ارائه بده که من نمیشناسمش و گرنه همین شرایط با میدولور auth که guard پیشفرض web روش اعمال میشه نتیجه صحیح هست
من با نسخه 7.28 لاراول همچین مشکلی ندارم
بعید میدونم از نسخه لاراول باشه.
اگر فقط کاربر رو برگردونی، باز هم همین مشکل هست؟
$user = auth('api')->user()
@ali.bayat
دقیقا این مورد رو انجام دادم و مشکلی حل شد، در واقعی هنگامی که رابطه رو درخواست میدم گیج میشه
شما دلیلش رو میدونید؟
@ali.bayat
به طور اتفاقی اومدم و از load استفاده کردم به جای with و مشکل حل شد
$userProfile = auth('api')->user()->load('meta');
درسته مشکل حل شده ولی هنوزم واسم سواله چرا باید برای لاراول این مشکل عجیب به وجود بیاد
مشکل که نیست.. این تفاوت عملکرد بین این ۲ متد هست
روابط در مدل های الکوئنت، در پشت صحنه از Join های بین جداول استفاده میکنند
نوع فراخوانی داده ها در متد های with و load با هم فرق میکنه
که این تفاوت باعث میشه نوع کوئری های متفاوتی ساخته و اجرا بشه
من جداول شما رو ندارم اما با رابطه بین User و Roles برات مثال میزنم:
اگر من بیام یه User رو پیدا کنم و با With بخواهم رابطه Roles رو بگیرم
یعنی چنین حالتی:
User::find(4)->with('roles')->get()
کوئری هایی که تولید میشند به شکل زیره:
"select * from `users` where `users`.`id` = 4 limit 1";
"select * from `users`";
"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) and `model_has_roles`.`model_type` = `App\User`"
من توی سیستمم کلا ۱۲ تا User دارم و میبینی که توی کوئری سوم داره whereIn روی هر ۱۲ تا کاربر زده میشه..
همچنین توی کوئری دوم هم داره تمام کاربرا رو میگیره
برای همین هم تمام کاربر ها رو برمیگردونه
حالا اگر از Load استفاده کنم:
User::find(4)->load('roles')
کوئری هایی که تولید میشند به شکل زیره:
"select count(*) as aggregate from `users`";
"select * from `users` where `users`.`id` = 4 limit 1";
"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (4) and `model_has_roles`.`model_type` = `App\User`";
اما این بار فقط یک آیدی توی whereIn داریم
با توجه به نوع کوئری هایی که اجرا میشه، چنین نتیجه ای کاملا منطقی هست
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟