2013-02-19 2 views
2

Я пытаюсь переписать некоторую логику для базы данных, которая ранее использовалась с Codeigniter. Конструкция такова, что некоторые из условий многие-ко-многим присоединиться сохраняются в соединительной таблице следующим образом:Laravel 4 Красноречивый: многие-ко-многим с условиями при соединении таблицы

Table user 
    - user_id 
    ... 

Table avatars 
    - user_id 
    - image_id 
    - uploaded_timestamp 
    - deleted_timestamp 

Table images 
    - image_id 
    ... 

В этом случае, я хочу, чтобы получить все изображения, связанные с пользователем с помощью аватар таблица, упорядоченная по времени, загруженному по убыванию, и не включая удаленные аватары (deleted_timestamp не null).

Я обнаружил, что использование hasMany от Eloquent не позволяет создавать условия для соединительной таблицы. Каков самый чистый способ добиться этого, или мне нужно прибегнуть к созданию полного запроса в том, как я привык с активным классом записей Codeigniter?

Примечание: Я нашел this answer, который предполагает использование ->hasMany(..)->with('another_column_from_pivot_table'), но это только кажется, работать с красноречивой реализацией Laravel 3'S. Кажется -> теперь есть только для загрузки агара.

ответ

4

hasMany() предназначен для отношений один-ко-многим. Многие из многих ожидают, что принадлежитToMany() - это утверждение, которое связано с таблицей itermediate («поворот»).

Я не пробовал, но могу поверить, что принадлежностьToMany() не будет работать с оператором where(). Я знаю, что hasMany() отлично работает с where().

Что вам может понадобиться сделать, это создать третий класс модели:

(ВНИМАНИЕ: не тестировалась код)

class User extends Eloquent { 
    public avatars() { 
     return $this->hasMany('Avatar') 
        ->where ('deleted_timestamp',0) 
        ->orderBy('uploaded_timestamp','desc'); 
    } 
} 

class Avatar extends Eloquent { 
    public image() { 
    return $this->belongsTo('Image'); 
    } 
} 

class Image extends Eloquent { 
} 

Вы хотите получить доступ изображения, как ...

$avatars = User::find($user_id)->avatars(); 
foreach ($avatars as $avatar) { 
    echo '<img src="$avatar->image->url">'; 
} 
+1

Спасибо. Я также обнаружил, что вы можете использовать '-> withPivot ('column_name')', чтобы получить значения столбцов столбцов, возвращенные с помощью коллекции fromTotMany. Но, как вы указываете, это все равно оставляет мне возможность не добавлять порядок и где фильтровать коллекцию. Вы будете работать, а также использовать foreach в коллекции и вручную извлекать и заказывать, но ваш более идеален. Благодаря! – epocsquadron