Много-много объединений в Zend Query, надеюсь, просто небольшая настройка - PullRequest
0 голосов
/ 26 февраля 2010

Извиняюсь за весь этот код, во всяком случае, я переделываю запрос в способ работы с Zend-запросами, вот что я до сих пор:

$db = Zend_Registry::get ( "db" );      
    $stmt = $db->query('
    SELECT recipe_pictures.picture_id, recipe_pictures.picture_filename, course.course_name, cuisines.name, recipes.id, recipes.Title, recipes.Method, recipes.author, recipes.SmallDesc, recipes.user_id, recipes.cuisine, recipes.course, recipes.Created_at, recipes.vegetarian, recipes.Acknowledgements, recipes.Time, recipes.Amount, recipes.view_count, recipes.recent_ips, guardian_writers.G_item, guardian_writers.G_type
    FROM recipes
    LEFT JOIN course ON recipes.course = course.course_id
    LEFT JOIN recipe_pictures ON recipes.id = recipe_pictures.recipe_id
    LEFT JOIN cuisines ON recipes.cuisine = cuisines.id
    LEFT JOIN guardian_writers ON recipes.author = guardian_writers.G_author
    WHERE recipes.id = ?', $id);
    $stmt->setFetchMode(Zend_Db::FETCH_ASSOC);
    $recipes = $stmt->fetchAll();

    return $recipes;

Это выше работает, пытаясь получить версию Zend правильно, мои усилия ниже.

    $db = Zend_Registry::get ( "db" );      
    $select = $db->select()
                 ->from(array('r' => 'recipes'))
                 ->join(array('c' => 'course'),
                        'r.course = c.course_id')
                 ->join(array('rp' => 'recipe_pictures'),
                        'r.id = rp.recipe_id')
                 ->join(array('cui' => 'cuisines'),
                        'r.cuisine = cui.id')
                 ->join(array('gw' => 'guardian_writers'),
                        'r.author = gw.G_author')
                 ->where(' id = ? ', $id);

    $recipes = $db->fetchRow($select);

    return $recipes;

Если кто-то может заметить ошибку, буду очень признателен, спасибо

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Используйте joinLeft вместо join для создания левых объединений.

Чтобы извлечь определенные столбцы из таблицы, а не все (*), используйте это:

->from(array('r' => 'recipes'), array('id', 'title', 'method'))

или

->joinLeft(array('rp' => 'recipe_pictures'),
                    'r.id = rp.recipe_id',
                    array('picture_id', 'picture_filename')
                    )

Чтобы не получать столбцы из таблицы, передайте пустой массив в качестве третьего параметра.

0 голосов
/ 26 февраля 2010

Метод join обеспечивает sql INNER JOIN. Если вы хотите получить LEFT JOIN, вы должны использовать joinLeft.

...