ยี่2. โมเดลที่เกี่ยวข้อง

ฉันมี 3 รุ่น: รายการ ซีเรียล และหมวดหมู่ซีเรียล เมื่อฉันแสดงแบบฟอร์มรายการ (เพื่อสร้างหรืออัปเดต) ฉันจำเป็นต้องแสดงซีเรียลที่เป็นของ CategoryId ที่เลือกในขั้นตอนก่อนหน้า อนุกรมสามารถอยู่ในได้มากกว่าหนึ่งหมวดหมู่

ตอนนี้ฉันมีโมเดล Item ของฉันแล้ว:

public function getSerialsTypeByCategory() {
        return (new SerialType)->getByCategory($this->itemCategoryId);
    }

ในรุ่น SerialType ของฉัน:

public function getByCategory($itemCategoryId) {

        return SerialTypeItemCategory::find()->select(['serialTypeId'])->where(['itemCategoryId' => $itemCategoryId])->all();

    }

นี่ได้ผล มันทำตามที่ฉันต้องการ แต่ ... นี่เป็นวิธีที่ถูกต้องหรือไม่? มีวิธีที่ดีกว่า?


person Eduardo    schedule 25.07.2016    source แหล่งที่มา
comment
ดูเหมือนถูกต้องสำหรับฉัน .. รหัสอยู่ในตำแหน่งที่ถูกต้อง (รุ่น) และเขียนด้วยวิธีที่ถูกต้อง ( getter)   -  person scaisEdge    schedule 25.07.2016


คำตอบ (1)


มันไม่ผิดสิ่งที่คุณกำลังทำอยู่ แต่มีบางอย่างเพิ่มเติม - ตรวจสอบลิงก์นี้: การทำงาน ด้วยข้อมูลเชิงสัมพันธ์

หากคุณใช้ ->hasOne และ ->hasMany เพื่อกำหนดความสัมพันธ์ โมเดลของคุณจะได้รับสิทธิประโยชน์เพิ่มเติมบางอย่าง เช่น เข้าร่วมโดยที่ขี้เกียจหรือกระตือรือร้นในการโหลด:

Item::findOne($id)->with(['categories'])->all();

ด้วยความสัมพันธ์ คุณยังสามารถใช้ ->link และ ->unlink เพื่อเพิ่ม/ลบข้อมูลที่เกี่ยวข้องโดยไม่ต้องคำนึงถึงฟิลด์ที่เชื่อมโยง

นอกจากนี้ยังง่ายต่อการกำหนดความสัมพันธ์ผ่านตารางเชื่อมต่อ:

class Order extends ActiveRecord
{
    public function getItems()
    {
        return $this->hasMany(Item::className(), ['id' => 'item_id'])
            ->viaTable('order_item', ['order_id' => 'id']);
    }
}
person e-frank    schedule 25.07.2016
comment
ขอบคุณมาก! ฉันจะค้นคว้าเกี่ยวกับ viaTable ครั้งแรกที่ฉันเห็น - person Eduardo; 25.07.2016