رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
کوئری برای جداول many to many با جدول واسط
#1
سلام

من 3 تا جدول دارم به نام های :
project
category
catproject

و مثلا این مقادیر رو دارد:

دسته بندی (category)
1 اندروید
2 وب

پروژه (project)
1 بازار
2 دیوار
3 پونیشا

جدول واسط(catproject)
category project
1 1
1 2
2 3

حالا می خوام مثلا توی دسته بندی اندروید آخرین پروژه رو برگردونه.
پاسخ
تشکر شده توسط:
#2
SELECT `p`.* FROM `catproject` `cp`
LEFT JOIN `category` `c` ON `cp`.`cid`=`c`.`id`
LEFT JOIN `product` `p` ON `cp`.`pid`=`p`.`id`
WHERE (`c`.`title`='Android')
ORDER BY `cp`.`pid` DESC
LIMIT 1
پاسخ
تشکر شده توسط: farazsahebdel
#3
خیلی ممنون فقط اکتیو رکوردش رو هم بدید عالی می شه.
و همین طور مدل برای catproject یعنی جدول واسطه نیاز هست ؟
پاسخ
تشکر شده توسط:
#4
بله جدول واسط و مدل نیاز داره چون Join رو براساس مدل جدول واسط میزنه:
$posts = Posts::find()
    ->joinWith('categories', true)
    ->where(['category.title' => 'Android'])
    ->all();
پاسخ
تشکر شده توسط: farazsahebdel
#5
$project = \frontend\models\Project::find()
        ->joinWith('catprojects', true)
       ->where(['category.name' => 'اندروید'])
       ->all();


نقل قول:
Column not found: 1054 Unknown column 'category.name' in 'where clause'
The SQL being executed was: SELECT `project`.* FROM `project` LEFT JOIN `catproject` ON `project`.`id` = `catproject`.`project_id` WHERE `category`.`name`='اندروید'


و اینم relation هام:

مدل project

public function getCatprojects()
    {
       return $this->hasMany(Catproject::className(), ['project_id' => 'id']);
   }

مدل catproject

public function getCat()
    {
       return $this->hasOne(Category::className(), ['id' => 'cat_id']);
   }

public function getProject()
    {
       return $this->hasOne(Project::className(), ['id' => 'project_id']);
   }


مدل category

public function getCatprojects()
    {
       return $this->hasMany(Catproject::className(), ['cat_id' => 'id']);
   }
پاسخ
تشکر شده توسط:
#6
بجای category اسم جدول رو بگذارین. بجای name هم عنوان دسته‌بندی رو بگذارین که فکر کنم title گذاشتین.
پاسخ
تشکر شده توسط:
#7
$project = \frontend\models\Project::find()
        ->joinWith('catprojects', true)
        ->leftJoin('category','`category`.`id`=`catproject`.`cat_id`')
        ->where(['category.name' => $name])
        ->orderBy('id DESC')
        ->limit(1)
        ->all();
این کار کرد.
این روش بهترین روش از نظر performance ؟
پاسخ
تشکر شده توسط:
#8
روش خوبیه ولی کلاً بهترین روش وجود نداره. بسته به شرایط مختلف ممکنه دستور مربوطه فرق کنه. تا زمانی که به مشکل خاصی توی کار بر نخوردین، بهترین روش همونی هست که راحتتر میتونید ازش استفاده کنید.
پاسخ
تشکر شده توسط: farazsahebdel




کاربران در حال بازدید این موضوع: 1 مهمان