سلام
من اومدم جداول terms وردپرس رو برای لاراول ایجاد کردم
جداول شامل :
posts
terms
termtaxonomy
termrelationship
تو مدل ها ارتباط چند به چند رو مشخص کردم و تو ذخیره اطلاعات مشکلی نیست
حالا می خوام یه کوئری بزنم همه پست ها رو بیاره خروجی می خوام یه آرایه تو در تو به این شکل بشه :
[0] => Array
(
[Post] => Array
(
[id] => 1
[title] => First article
[content] => aaa
[created] => 2008-05-18 00:00:00
)
[Tag] => Array
(
[0] => Array
(
[id] => 1
[name] => tag1
)
[1] => Array
(
[id] => 2
[name] => tag2
)
)
[Category] => Array
(
[0] => Array
(
[id] => 1
[name] => cat1
)
[1] => Array
(
[id] => 2
[name] => cat2
)
)
[1] => Array
(
[Post] => Array
(...
تو mysql که کوئری رو تست می کنم خب بابت هر تعداد tag و category رکورد پست و تکرار می کنه تو این لینک https://stackoverflow.com/questions/11551061/how-to-get-nested-array-from-mysql-select-with-joins گفته بیا اول پست ها رو fetch کن بعد بیا با حلقه postid رو بفرست و کوئری های دیگه رو بزن و نتایج رو بریز تو یه آرایه دومی
حالا می خوام ببینم لاراول راه حل ساده تری نداره ؟ اگر با query builder یا راه حل بهتر دیگه ای هست ممنون می شم راهنمایی کنید
سلام اگر به درستی روابط چند به چند رو پیاده سازی کرده باشید به این صورت میتونید:
$res = array();
$posts = Post::all();
foreach ($posts as $post) {
$postItem = array(
['id'] => $post->id,
['title'] => $post->title,
['content'] => $post->content,
['created'] => $post->created_at
);
$tagArray = array();
foreach ($post->tag as $tag) {
array_push($tagArray, [
['id'] => $tag->id,
['name'] => $tag->name
]);
}
$catArray = array();
foreach ($post->categories as $cat) {
array_push($catArray, [
['id'] => $cat->id,
['name'] => $cat->name
]);
}
$item = array(
['Post'] => $postItem,
['Tag']=>$tagArray,
['Category']=>$catArray
);
array_push($res,$item);
}
dd($res);
@m.fartaj
سلام.
باید از ویژگی های Eloquent استفاده کنید. برای اینکه اون مقادیر رو هم هر بار نشون بدید بهتره که از Eager Loadingاستفاده کنید.
https://laravel.com/docs/7.x/eloquent-relationships#eager-loading
سلام اگر به درستی روابط چند به چند رو پیاده سازی کرده باشید به این صورت میتونید:
$res = array();
$posts = Post::all();
foreach ($posts as $post) {
$postItem = array(
['id'] => $post->id,
['title'] => $post->title,
['content'] => $post->content,
['created'] => $post->created_at
);
$tagArray = array();
foreach ($post->tag as $tag) {
array_push($tagArray, [
['id'] => $tag->id,
['name'] => $tag->name
]);
}
$catArray = array();
foreach ($post->categories as $cat) {
array_push($catArray, [
['id'] => $cat->id,
['name'] => $cat->name
]);
}
$item = array(
['Post'] => $postItem,
['Tag']=>$tagArray,
['Category']=>$catArray
);
array_push($res,$item);
}
dd($res);
@amin.mokhtari94
ممنون برای post به termrelationship جواب داد ولی چون خود post با tag و category ارتباط نداره و termrelationship با جدول مربوط ارتباط داره و جداولشون از هم جدا نیستن فقط با یک فیلد type از هم جدا می شن که از نوع tag هست یا category برای پیدا کردن دومی یک تابع برای جستجو زدم و اکی شد فقظ یک سوال برای تعداد بالای پست این کار درسته و eloquent پیشنهاد می شه ؟!
تصویر دیتا مدل وردپرس رو هم گذاشتم تا بهتر متوجه جداول بشید
وردپرس به دلایلی از قبیل کاستوم فیلد و قابلیت اینکه پلاگین ها یا کاربر بتونند برای خودشون انواع داده تعریف کنند اومده از termrelationship استفاده کرده، بهتره در سیستم لاراولی از این روش استفاده نکنید.
بله یکی از قابلیت های خوب لاراول Eloquent ORM هست، پیشنهاد میکنم حتما کار کنید باهاش.
موفق باشید
@amin.mokhtari94
ممنون همین custom field رو می خوام پیاده کنم حالا به صورت فرم ساز فقط پلاگین ندارم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟