1

我有一个可以正常工作的原始查询,但我无法将它翻译成 laravel eloquent ......

这是我的桌子:

用户

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. 如果我尝试使用原始查询 via 来执行此操作DB::raw(),它会返回一个数组,然后我无法对结果进行分页或排序。
  2. 我找不到从 Eloquent 的几个表中“选择”的方法
  3. 我不知道如何从数组中提取数据并获取 Collection
  4. 我仍然不确定我是否做对了。

那么有没有办法使这项工作?


编辑:

需要明确的是,我想要得到的是:

用户集合包含

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

我可以申请->oldest('seen')->latest()->paginate($n)或类似的东西。

4

1 回答 1

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_client因此,在您的查询中,您将分别按列加入客户和使用表id_employe。因此,如果您修改User模型并更改id_marchand为函数和函数,这段代码应该可以工作(或者至少它对我有用)id_employeemployesid_clientclients

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

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 
于 2016-08-29T14:50:46.437 回答