تالار گفتمان nCIS.ir

نسخه‌ی کامل: کوئری برای جداول many to many با جدول واسط
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام

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

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

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

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

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

حالا می خوام مثلا توی دسته بندی اندروید آخرین پروژه رو برگردونه.
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
خیلی ممنون فقط اکتیو رکوردش رو هم بدید عالی می شه.
و همین طور مدل برای catproject یعنی جدول واسطه نیاز هست ؟
بله جدول واسط و مدل نیاز داره چون Join رو براساس مدل جدول واسط میزنه:
$posts = Posts::find()
    ->joinWith('categories', true)
    ->where(['category.title' => 'Android'])
    ->all();
$project = frontendmodelsProject::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']);
   }
بجای category اسم جدول رو بگذارین. بجای name هم عنوان دسته‌بندی رو بگذارین که فکر کنم title گذاشتین.
$project = frontendmodelsProject::find()
        ->joinWith('catprojects', true)
        ->leftJoin('category','`category`.`id`=`catproject`.`cat_id`')
        ->where(['category.name' => $name])
        ->orderBy('id DESC')
        ->limit(1)
        ->all();
این کار کرد.
این روش بهترین روش از نظر performance ؟
روش خوبیه ولی کلاً بهترین روش وجود نداره. بسته به شرایط مختلف ممکنه دستور مربوطه فرق کنه. تا زمانی که به مشکل خاصی توی کار بر نخوردین، بهترین روش همونی هست که راحتتر میتونید ازش استفاده کنید.