将Raw sql查询转换为laravel eloquent query

时间:2016-08-29 13:55:54

标签: php mysql laravel eloquent laravel-query-builder

我有一个原始查询工作正常,但我无法将其翻译为laravel雄辩...

以下是我的表格:

用户

Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('username', 30)->unique();
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->integer('role_id')->unsigned();
        $table->boolean('seen')->default(false);
        $table->boolean('valid')->default(false);
        $table->boolean('confirmed')->default(false);
        $table->string('confirmation_code')->nullable();
        $table->timestamps();
        $table->rememberToken();
    });

客户

Schema::create('clients', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('id_marchand')->unsigned()->index();
        $table->foreign('id_marchand')->references('id')->on('users')->onDelete('cascade')->onUpdate('restrict');
        $table->integer('id_client')->unsigned()->index();
        $table->foreign('id_client')->references('id')->on('users')->onDelete('cascade')->onUpdate('restrict');
        $table->timestamps();

    });

雇用

Schema::create('employes', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('id_marchand')->unsigned()->index();
        $table->foreign('id_marchand')->references('id')->on('users')->onDelete('cascade')->onUpdate('restrict');
        $table->integer('id_employe')->unsigned()->index();
        $table->foreign('id_employe')->references('id')->on('users')->onDelete('cascade')->onUpdate('restrict');
        $table->timestamps();

    });

用户模型

<?php namespace App\Models;

/**
 * One to Many relation
 *
 * @return Illuminate\Database\Eloquent\Relations\hasMany
 */
public function employes()
{
    return $this->hasMany('App\Models\Employe', 'id_marchand');
}

/**
 * One to Many relation
 *
 * @return Illuminate\Database\Eloquent\Relations\hasMany
 */
public function clients()
{
    return $this->hasMany('App\Models\Client', 'id_marchand');
}

客户端模型

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Client extends Model
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'clients';

    /**
     * One to Many relation
     *
     * @return Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user() 
    {
        return $this->belongsTo('App\Models\User');
    }
}

雇员模型

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Employe extends Model
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'employes';

    /**
     * One to Many relation
     *
     * @return Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user() 
    {
        return $this->belongsTo('App\Models\User');
    }
}

我正在尝试翻译的原始查询:

SELECT users.* 
FROM clients, users 
WHERE clients.id_marchand = 8 
AND users.id = clients.id_client 
UNION 
SELECT users.* 
FROM employes, users 
WHERE employes.id_marchand = 8 
AND users.id = employes.id_employe 
UNION 
SELECT users.*
FROM users
WHERE users.id = 8
ORDER BY `seen` ASC, `created_at` DESC 
LIMIT 25 OFFSET 0

我的问题是:

  1. 如果我尝试使用原始查询,通过DB::raw(),它会返回一个 数组,然后我无法对结果进行分页或排序。
  2. 我找不到从Eloquent
  3. 中的几个表中选择'select'的方法
  4. 我不知道如何从数组中提取数据并获取Collection
  5. 我仍然不确定我是否做得对。
  6. 有没有办法让这项工作成功?

    编辑:

    要清楚,我想要的是:

    用户集合,其中包含:

    • 用户8的“客户”
    • 的用户
    • “用户8”的用户
    • 用户8。

    我可以在其上申请->oldest('seen')->latest()->paginate($n)或等效的内容。

1 个答案:

答案 0 :(得分:2)

看起来您的员工模型设置正确,这应该使这个相当简单......

我认为考虑你要做的事情以及Eloquent如何帮助你做到这一点比仅仅尝试转换查询以使用查询构建器更容易。

$id = 8;
$users = App\User::whereHas('clients', function($q) use ($id) {
    $q->where('id_marchand', $id);
})->orWhereHas('employes', function($q) use ($id) {
    $q->where('id_marchand', $id);
})->orWhere('id', $id)
->orderBy('seen')
->oldest()
->get();

这将返回User个模型的集合。如果您想分页,只需将get()换成paginate($numRecords),其中$ numRecords是您每页所需的记录数。

然后使用该模型集合,您可以使用foreach循环输出每个用户的数据....

foreach ($users as $user) {
    echo 'email: ' . $user->email;
}

编辑:我错了,我没有仔细观察模特。因此,在您的查询中,您将分别按列id_clientid_employe加入客户并使用表。因此,如果您修改User模型并将id_marchand更改为id_employe employes函数,将id_client函数更改为clients,则此代码应该工作(或者至少对我而言)。

为了澄清,上面的代码会生成以下查询,以便您在进行任何更改之前自己查看结果...

SELECT 
    * 
FROM
    `users` 
WHERE EXISTS 
    (SELECT 
    * 
    FROM
    `clients` 
    WHERE `clients`.`id_client` = `users`.`id` 
    AND `id_marchand` = '8') 
    OR EXISTS 
    (SELECT 
    * 
    FROM
    `employes` 
    WHERE `employes`.`id_employe` = `users`.`id` 
    AND `id_marchand` = '8') 
    OR `id` = '8' 
ORDER BY `seen` ASC,
    `created_at` ASC