اذهب إلى المحتوى

السؤال

نشر

لدي جدولين جدول للمنشورات وجدول اخر للتعليقات على المنشورات وبينهما علاقه في عمود post_id، كيف يمكنني باستلام واحد عرض المنشورات وتحت كل منشور التعليقات الخاصه به. 

طبعا يمكنني فعل ذلك باستعلامين منفصلين، لذلك أسأل هل يمكن عمل هذا باستعلام واحد 

Recommended Posts

  • 0
نشر

 يمكنك عمل استعلام واحد لاسترجاع بيانات المنشورات مع تعليقاتها المرتبطة من خلال استخدام عبارة 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
نشر

يمكنك تحقيق ذلك من خلال طريقتين :
الأولى : باستخدام الـ
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
نشر

يمكنك القيام بذلك باستخدام استعلام واحد يجمع بين المنشورات والتعليقات المتعلقة بها. يمكن استخدام عبارة 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
نشر
بتاريخ 17 دقائق مضت قال Thaer Alhabbash:

يمكنك تحقيق ذلك من خلال طريقتين :
الأولى : باستخدام الـ
mysql
بما أن الـ post_id مفتاح اجنبي (foreign_key) في جدول التعليقات , اذا علينا استخدام الـ Left Join لجلب جميع التعليقات الخاصة بكل منشور كالتالي:
 

SELECT posts.*, comments.*
FROM posts
LEFT JOIN comments ON posts.id = comments.post_id;

ماذا لو اردت عرض جميع المنشورات وثلاثه تعليقات فقط من كل منشور 

  • 0
نشر

إذا كنت ترغب في عرض جميع المنشورات مع ثلاثة تعليقات فقط من كل منشور، يمكنك تحقيق ذلك باستخدام الدالة النافذة 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
نشر
بتاريخ 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
نشر
بتاريخ 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
نشر (معدل)
بتاريخ 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();

 
تم التعديل في بواسطة Thaer Alhabbash
اضافة جديدة للكود , كان هناك نقص في تحديد اسم العمود لأي جدول
  • 0
نشر
بتاريخ منذ ساعة مضت قال علي الكاسر:

اخي جربت هذا الكود ولم يعمل وماذا تعني هذه الجمله 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 لتخزين نص التعليق 

 

الان اريد صياغة الكود اعلاه ليتم عرض المنشورات واسماء مرسليها وتحت كل منشور يتم عرض ثلاثه تعليقات مع اسماء مرسليها. 

اتمنى الرد وشكرا جزيلا 

اذا لم يتم عرض ما ذكرته له كما تريد فإذا اردت قم بوضع المشروع هنا مع قاعدة البيانات وسأقوم بتنفيذ كل ما تريد ان شاء الله

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...