2014-09-11 2 views
0

Я разрабатываю приложение laravel последние пару месяцев, и это моя первая поездка с каркасом. Я также впервые обнимаю и использую ORM (Eloquent).Использование Eloquent в Laravel для более продвинутых запросов БД

По большей части, Eloquent кажется довольно прямым, когда выполняет базовые операции с БД. Однако, когда что-то становится немного сложнее, я часто нахожусь слишком много времени, пытаясь понять, как это сделать «Красноречивый», и прыгать с корабля на необработанные db-запросы.

Было надеяться, что кто-то может подумать о том, должен ли мой желаемый результат в более сложных запросах, таких как приведенный ниже, быть достигнут с помощью Eloquent довольно легко или что я должен просто продолжать использовать необработанные запросы БД.

Таблицы: продукты, пользователей, оповещения

оповещения имеют user_id, product_id, а amount, в которой пользователь хотел бы получить уведомление о том, что продукт находится в продаже по определенной цене.

В настоящее время я использую сырой запрос дб, чтобы получить все предупреждения:

SELECT p.*, u.firstname, u.lastname, u.email, a.amount AS alert_amount 
FROM alerts AS a          
JOIN dods AS d ON a.product_id = d.product_id           
JOIN products AS p ON d.product_id = p.id           
JOIN users AS u ON u.id = a.user_id 
WHERE a.amount <= p.saleprice1 

Мои красноречивых модели устанавливаются с отношениями следующим

пользователя Модель

public function alerts() 
{ 
    return $this->hasMany('Alert'); 
} 

Модель продукта

public function alerts() 
{ 
    return $this->hasMany('Alert'); 
} 

оповещения Модель

public function product() 
{ 
    return $this->belongsTo('Product'); 
} 

public function user() 
{ 
    return $this->belongsTo('User'); 
}  

Спасибо за любые предложения. Мэтт

ответ

0

Это на самом деле в конечном итоге является правильный ответ, который я искал (с http://laravel.io/forum и благодаря @onecrush).

$alerts = Alert::with(['product','user'])->whereHas('product', function($q){ 
    $q->where('saleprice1', '<', DB::raw(alert.amount)); 
})->get(); 
0

Чтобы понять отношения, вам необходимо понять, где ссылка должна быть на таблицах.

Внимательный модель имеет belongsTo() отношения с User, указывающее alerts таблица имеет поле с именем user_id (обычно беззнаковое целое), который содержит соответствующий идентификатор пользователя.

Модель пользователя имеет отношение hasMany() с Alert, которое указывает, что таблица предупреждений содержит ссылку, как указано выше.

У одного пользователя есть много предупреждений, устанавливается соотношение «один-два».

Вы можете использовать эту связь с красноречием для любой операции CRUD.

Некоторые примеры, чтобы помочь вам по

Чтобы получить все оповещения пользователем

$alerts = User::find(1)->alerts()->get(); 

Чтобы получить пользователя, оповещения

$user = Alert::find(1)->user()->first(); 

Для вставки новое предупреждение снова й пользователь

$alert = new Alert(["name" => "alert1"]); 

$user = User::find(1); 

$user->alerts()->save($alert); 

Чтобы удалить все уведомления, связанные с пользователем

$user = User::find(1); 

$user->alerts()->delete(); 
+0

Прохладный. Так что это похоже на основную сторону вещей. На самом деле нужно выяснить, как получить оповещения, соответствующие критериям, и включить продукт и пользователя, привязанные к этому предупреждению. – user1462432

0

Все, что вам нужно, это отношения многие ко многим:

// User model 
public function products() 
{ 
    return $this->belongsToMany('Product') 
    ->wherePivot('amount', '>=', DB::raw('products.salesprice1')) 
    ->withPivot('amount'); 
} 

// then 
$user->products; // collection of products with price below alerts.amount 
+0

Ницца. Я попробую и вернусь к тебе. Кажется, это то, что я ищу. – user1462432

Смежные вопросы