لارافيل بليغ والعلاقة
-
20-12-2019 - |
سؤال
لدي رمز:
$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';
}