علي الكاسر نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 لدي جدولين جدول للمنشورات وجدول اخر للتعليقات على المنشورات وبينهما علاقه في عمود post_id، كيف يمكنني باستلام واحد عرض المنشورات وتحت كل منشور التعليقات الخاصه به. طبعا يمكنني فعل ذلك باستعلامين منفصلين، لذلك أسأل هل يمكن عمل هذا باستعلام واحد 2 اقتباس
0 Hessen Nasser نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 يمكنك عمل استعلام واحد لاسترجاع بيانات المنشورات مع تعليقاتها المرتبطة من خلال استخدام عبارة JOIN للانضمام بين جدولي المنشورات والتعليقات باستخدام العمود المشترك بينهما وهو post_id. واليك مثال على كيفية عمل ذلك: SELECT posts.*, comments.* FROM posts LEFT JOIN comments ON posts.post_id = comments.post_id; في هذا الاستعلام سيتم استرجاع جميع السجلات من جدول المنشورات (باستخدام posts.*)وسيتم أيضًا انضمام التعليقات المرتبطة من جدول التعليقات (باستخدام comments.*) باستخدام LEFT JOIN بناءً على post_id وإذا لم يكن هناك تعليقات متطابقة فستكون القيم في جدول التعليقات فارغة. اقتباس
0 Thaer Alhabbash نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 يمكنك تحقيق ذلك من خلال طريقتين : الأولى : باستخدام الـ mysql بما أن الـ post_id مفتاح اجنبي (foreign_key) في جدول التعليقات , اذا علينا استخدام الـ Left Join لجلب جميع التعليقات الخاصة بكل منشور كالتالي: SELECT posts.*, comments.* FROM posts LEFT JOIN comments ON posts.id = comments.post_id; الثانية: باستخدام العلقات في اطار العمل لارفيل اذا كنت تستخدم لارفيل. اذا كنت تستخدم اللارفيل فعليك انشاء اثنين مودل واحد للمنشورات والاخر للتعليقات , ومن ثم تقوم بانشاء العلاقة بين المنشورات و التعليقات داخل المودل و هي علاقة 1-M class Post extends Model { public function comments() { return $this->hasMany(Comment::class); } } class Comment extends Model { public function post() { return $this->belongsTo(Post::class); } } بعد ذلك و داخل الكونترولر نقوم بتنفيذ الكود التالي داخل الدالة الخاصة بجلب جميع التعليقات الخاصة بكل منشور $posts = Post::with('comment')->get(); و لعرض النتائج داخل ال blade نقوم بتنفيذ التالي : @foreach($posts as $post) <th>$post->title</th> -------------------------- <td>$post->comment->name</td> @endforeach اقتباس
0 بلال زيادة نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 يمكنك القيام بذلك باستخدام استعلام واحد يجمع بين المنشورات والتعليقات المتعلقة بها. يمكن استخدام عبارة JOIN للانضمام بين الجدولين واستخدام GROUP_CONCAT لجمع التعليقات تحت كل منشور. هنا هو مثال على كيفية فعل ذلك باستخدام SQL: SELECT posts.post_id, posts.post_content, GROUP_CONCAT(comments.comment_content) AS post_comments FROM posts LEFT JOIN comments ON posts.post_id = comments.post_id GROUP BY posts.post_id, posts.post_content; في هذا الاستعلام: نستعرض الجدول posts ونختار عمود post_id و post_content منه. نستخدم LEFT JOIN للانضمام بين الجدولين على أساس post_id. نستعرض الجدول comments ونختار عمود comment_content منه. نستخدم GROUP_CONCAT لدمج التعليقات المرتبطة بكل منشور في سلسلة واحدة. نستخدم GROUP BY لتجميع النتائج وفقًا لعمود post_id و post_content. اقتباس
0 علي الكاسر نشر 13 أغسطس 2023 الكاتب أرسل تقرير نشر 13 أغسطس 2023 بتاريخ 17 دقائق مضت قال Thaer Alhabbash: يمكنك تحقيق ذلك من خلال طريقتين : الأولى : باستخدام الـ mysql بما أن الـ post_id مفتاح اجنبي (foreign_key) في جدول التعليقات , اذا علينا استخدام الـ Left Join لجلب جميع التعليقات الخاصة بكل منشور كالتالي: SELECT posts.*, comments.* FROM posts LEFT JOIN comments ON posts.id = comments.post_id; ماذا لو اردت عرض جميع المنشورات وثلاثه تعليقات فقط من كل منشور 1 اقتباس
0 بلال زيادة نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 إذا كنت ترغب في عرض جميع المنشورات مع ثلاثة تعليقات فقط من كل منشور، يمكنك تحقيق ذلك باستخدام الدالة النافذة ROW_NUMBER() المتاحة في MySQL. هذا سيسمح لك بترقيم التعليقات داخل كل منشور ومن ثم اختيار الثلاثة التعليقات الأولى فقط. SELECT * FROM ( SELECT posts.*, comments.*, ROW_NUMBER() OVER (PARTITION BY posts.id ORDER BY comments.comment_id) AS comment_rank FROM posts LEFT JOIN comments ON posts.id = comments.post_id ) ranked_comments WHERE comment_rank <= 3; اقتباس
0 علي الكاسر نشر 13 أغسطس 2023 الكاتب أرسل تقرير نشر 13 أغسطس 2023 بتاريخ 3 دقائق مضت قال بلال زيادة: SELECT posts.post_id, posts.post_content, GROUP_CONCAT(comments.comment_content) AS post_comments FROM posts LEFT JOIN comments ON posts.post_id = comments.post_id GROUP BY posts.post_id, posts.post_content; شكرا اخي هذا ما اريد ولك كيف يمكن عرض الناتج في حلقة foreach وخاصه التعليقات وايضا اريد عرض ثلاثه تعليقات من كل منشور وليست كلها اقتباس
0 علي الكاسر نشر 13 أغسطس 2023 الكاتب أرسل تقرير نشر 13 أغسطس 2023 بتاريخ 2 ساعة قال بلال زيادة: إذا كنت ترغب في عرض جميع المنشورات مع ثلاثة تعليقات فقط من كل منشور، يمكنك تحقيق ذلك باستخدام الدالة النافذة ROW_NUMBER() المتاحة في MySQL. هذا سيسمح لك بترقيم التعليقات داخل كل منشور ومن ثم اختيار الثلاثة التعليقات الأولى فقط. SELECT * FROM ( SELECT posts.*, comments.*, ROW_NUMBER() OVER (PARTITION BY posts.id ORDER BY comments.comment_id) AS comment_rank FROM posts LEFT JOIN comments ON posts.id = comments.post_id ) ranked_comments WHERE comment_rank <= 3; اخي جربت هذا الكود ولم يعمل وماذا تعني هذه الجمله ranked_comments لم افهم وجودها هنا ولماذا وضعتها، ارجو منك اخي اعادة كتابة الكود بما يتناسب مع بنية الجداول التاليه جدول المستخدمين user الاعمده id لتخزين اي دي المستخدم name لتخزين اسم المستخدم جدول المنشورات posts الاعمده post_id لتخزين اي دي المنشور وربطه مع جدول التعليقات post_user لتخزين اي دي المستخدم مرسل المنشور والربط مع جدول المستخدمين مع العمود id post_msg لتخزين نص المنشور الجدول الثالث جدول التعليقات comment الاعمده com_id لتخزين اي دي التعليق com_id_post لتخزين رقم اي دي المنشور والربط مع جدول المنشورات عبر العمود post_id com_user لتخزين اي دي مرسل التعليق والربط مع جدول المستخدمين عبر العمود id com_msg لتخزين نص التعليق الان اريد صياغة الكود اعلاه ليتم عرض المنشورات واسماء مرسليها وتحت كل منشور يتم عرض ثلاثه تعليقات مع اسماء مرسليها. اتمنى الرد وشكرا جزيلا اقتباس
0 Thaer Alhabbash نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 (معدل) بتاريخ 3 ساعة قال علي الكاسر: ماذا لو اردت عرض جميع المنشورات وثلاثه تعليقات فقط من كل منشور اذا اردت استخدام ال query builder فقم بتنفيذ ما يلي: SELECT posts.post_id, posts.post_content, GROUP_CONCAT(comments.comment_content) AS post_comments FROM posts LEFT JOIN comments ON posts.post_id = comments.post_id ORDER BY comments.created_at LIMIT 3; اما باستخدام اللارفيل فبإمكانك تنفيذ ما يلي بالاضافة الى ما تم توضيحه سابقا: $posts = Post::with('comment')->orderBy('created_at)->limit(3); او بإمكانك استخدام ما يلي : $posts = Post::with('comment')->latest()->take(3)->get(); تم التعديل في 13 أغسطس 2023 بواسطة Thaer Alhabbash اضافة جديدة للكود , كان هناك نقص في تحديد اسم العمود لأي جدول اقتباس
0 Thaer Alhabbash نشر 13 أغسطس 2023 أرسل تقرير نشر 13 أغسطس 2023 بتاريخ منذ ساعة مضت قال علي الكاسر: اخي جربت هذا الكود ولم يعمل وماذا تعني هذه الجمله ranked_comments لم افهم وجودها هنا ولماذا وضعتها، ارجو منك اخي اعادة كتابة الكود بما يتناسب مع بنية الجداول التاليه جدول المستخدمين user الاعمده id لتخزين اي دي المستخدم name لتخزين اسم المستخدم جدول المنشورات posts الاعمده post_id لتخزين اي دي المنشور وربطه مع جدول التعليقات post_user لتخزين اي دي المستخدم مرسل المنشور والربط مع جدول المستخدمين مع العمود id post_msg لتخزين نص المنشور الجدول الثالث جدول التعليقات comment الاعمده com_id لتخزين اي دي التعليق com_id_post لتخزين رقم اي دي المنشور والربط مع جدول المنشورات عبر العمود post_id com_user لتخزين اي دي مرسل التعليق والربط مع جدول المستخدمين عبر العمود id com_msg لتخزين نص التعليق الان اريد صياغة الكود اعلاه ليتم عرض المنشورات واسماء مرسليها وتحت كل منشور يتم عرض ثلاثه تعليقات مع اسماء مرسليها. اتمنى الرد وشكرا جزيلا اذا لم يتم عرض ما ذكرته له كما تريد فإذا اردت قم بوضع المشروع هنا مع قاعدة البيانات وسأقوم بتنفيذ كل ما تريد ان شاء الله اقتباس
السؤال
علي الكاسر
لدي جدولين جدول للمنشورات وجدول اخر للتعليقات على المنشورات وبينهما علاقه في عمود post_id، كيف يمكنني باستلام واحد عرض المنشورات وتحت كل منشور التعليقات الخاصه به.
طبعا يمكنني فعل ذلك باستعلامين منفصلين، لذلك أسأل هل يمكن عمل هذا باستعلام واحد
9 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.