سؤال

لدي رمز:

$response = $this->posts
    ->where('author_id', '=', 1)
    ->with(array('postComments' => function($query) {
        $query->where('comment_type', '=', 1);
    }))
    ->orderBy('created_at', 'DESC')
    ->limit($itemno)
    ->get();

وعندما قمت بتسجيل هذا الاستعلام مع:

$queries = \DB::getQueryLog();
$last_query = end($queries);
\Log::info($last_query);

في ملف السجل أرى متابعة:

"select * from `post_comments` where `post_comments`.`post_id` in (?, ?, ?, ?) and `comment_type` <> ?"

لماذا علامة الاستفهام للتعليق_اكتب في الاستعلام?

تحديث #1:

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

$response = $this->posts
    ->where('author_id', '=', 1)
    ->join('post_comments', 'post_comments.post_id', '=', 'posts.id')
    ->where('comment_type', '=', 1)
    ->orderBy('created_at', 'DESC')
    ->limit($itemno)
    ->get();
هل كانت مفيدة؟

المحلول

وراء الكواليس شركة تنمية نفط عمان يتم استخدامه وانها الطريقة التي PDO هل كاستعلام معد ، على سبيل المثال تحقق من هذا:

$title = 'Laravel%';
$author = 'John%';
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));

في وقت التشغيل أثناء تنفيذ الاستعلام بواسطة execute() ال ? سيتم استبدال العلامات بالقيمة التي تم تمريرها execute(array(...)). Laravel/Eloquent الاستخدامات PDO وهو سلوك طبيعي في PDO (كائنات البيانات فب).هناك طريقة أخرى تستخدم في PDO, ، الذي يدعى parameter/placeholder مثل :totle يستخدم بدلا من ?.اقرأ المزيد عنها في الرابط المحدد ، إنه موضوع آخر.تحقق أيضا هذه الإجابة.

تحديث: في وقت التشغيل ? سيتم استبدال العلامات بالقيمة التي قدمتها ، لذلك ? سيتم استبدال مع 1.أيضا هذا query هو الاستعلام العلائقية ، والجزء الثاني بعد الاستعلام الأول قد فعلت تحميل idق من posts الجدول.لمشاهدة كافة سجلات الاستعلام ، حاول هذا بدلا من ذلك:

$queries = \DB::getQueryLog();
dd($queries);

يمكنك التحقق من الاستعلامين الأخيرين لتصحيح الاستعلامات للمكالمة التالية:

$response = $this->posts
->where('author_id', '=', 1)
->with(array('postComments' => function($query) {
    $query->where('comment_type', '=', 1);
}))
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();

تحديث بعد التوضيح:

يمكنك استخدام شيء من هذا القبيل إذا كان لديك علاقة الإعداد في الخاص بك Posts نموذج:

// $this->posts->with(...) is similar to Posts::with(...)
// if you are calling it directly without repository class
$this->posts->with(array('comments' =. function($q) {
    $q->where('comment_type', 1);
}))
->orderBy('created_at', 'DESC')->limit($itemno)->get();

لجعلها تعمل تحتاج إلى إعلان العلاقة في الخاص بك Posts (حاول استخدام اسم المفرد Post إذا كان ذلك ممكنا) نموذج:

public function comments()
{
    return $this->hasmany('Comment');
}

الخاص بك Comment يجب أن يكون النموذج مثل هذا:

class Comment extends Eloquent {
    protected $table = 'post_comments';
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top