2015-09-23 5 views
1

Я использую Laravel 5.1 в своем приложении.Convert Mysql Query to Laravel Eloquent

Мой MySQL Query является

SELECT * FROM (SELECT uu.*,t.left_id AS meb_id,(CAST(t.pair AS UNSIGNED) - IFNULL(p.pair,0)) AS pair FROM (SELECT left_id, 
(CASE 
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000') >= (SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2) 
THEN (SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') 
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000') < (SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2) 
THEN ((SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') /2) 
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') >= (SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2) 
THEN (SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000') 
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') < (SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2) 
THEN ((SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000')/2) END 
) AS pair 
FROM user_count AS u WHERE left_id <> 0 GROUP BY left_id) AS t 
LEFT JOIN users AS uu ON uu.`id` = t.left_id 
LEFT JOIN `total_payment` p ON t.left_id = p.`meb_id` 
WHERE t.pair <> 0) AS f WHERE f.pair > 0 AND f.active = 1 

Как я могу преобразовать его в Laravel красноречив? Я не знаю, как использовать when case в laravel eloquent.

Моя база данных схема подобна этой

user_count стол enter image description here

user стол enter image description here

total_payment стол

enter image description here

Может ли кто-нибудь мне помочь?

+0

Не уверен, что я понимаю, почему вы хотели бы сделать это с помощью Eloquent vs, используя прямой SQL-запрос с фазой DB. – Pitchinnate

+0

@Pitchinnate Этот запрос занимает слишком много времени для выполнения, поэтому я думаю, что если я запустил его, используя красноречивый, было бы лучше. –

+1

Я не думаю, что вы понимаете, что такое красноречие. – Pitchinnate

ответ

0

Eloquent - это ORM (объектно-реляционное сопоставление), это означает, что вы можете сопоставить свою базу данных с объектами PHP (Eloquent использует шаблон Active Record).

Это не DBAL, однако вы все равно можете выполнять SQL-запросы через DB Facade.

В примере, представленном вами, пользовательская таблица может быть ярким объектом.

class User extends Model{ 
    /** 
    * The table associated with the model. 
    * 
    * @var string 
    */ 
    protected $table = 'user'; 
} 

Поскольку теперь вы можете получить все строки пользователей, например:

$userCollection = (new User)->all(); //Fetch all rows 

Или вы можете найти один на ПК, как:

$user = (new User)->find(123); //123 is the PK of the User 
+0

Я уже запускаю этот запрос, используя DB Facade. Но я хочу преобразовать этот запрос в Laravel Eloquent. Так как я могу это сделать? Я создал модель для каждой таблицы. –

1

Просто окружить необработанный запрос с БД :: («»), например:

DB::statement("INSERT INTO `mydatabase`.`mytable` (`id`, `created_at`, `updated_at`, `deleted_at`) VALUES ('7', '2015-09-26 13:38:48', '2015-09-26 13:43:41', NULL)"); 

Он отлично справится с работой и работает с семенами.

+0

Я уже выполняю этот запрос, используя 'DB :: statement (" ")'. И я хочу запустить его с помощью 'Eloquent' –