我有一个原始查询工作正常,但我无法将其翻译为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
DB::raw()
,它会返回一个
数组,然后我无法对结果进行分页或排序。有没有办法让这项工作成功?
要清楚,我想要的是:
用户的集合,其中包含:
我可以在其上申请->oldest('seen')->latest()->paginate($n)
或等效的内容。
答案 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_client
和id_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