简体   繁体   English

用两个不同的列laravel连接同一张表

[英]Join the same table with two different column laravel

I try these code in MySQl: 我在MySQl中尝试以下代码:

SELECT      
     A.*, 
     B.name,
     C.name
FROM 
     eventlog_tbl as A
     LEFT JOIN users B ON A.byuser=B.email 
     LEFT JOIN users C ON A.affectiveuser=C.email;

I try these in Laravel 我在Laravel中尝试这些

return DB::table('eventlog_tbl')
            ->leftjoin('users', 'users.email', '=', 'eventlog_tbl.byuser')
            ->leftjoin('users', 'users.email', '=', 'eventlog_tbl.affectiveuser')
            ->select('eventlog_tbl.*','users.name','users.name')
            ->get();

How can i convert it to Laravel? 如何将其转换为Laravel?

Try below code: 试试下面的代码:

$res =  DB::table('eventlog_tbl')
        ->leftjoin('users AS A', 'A.email', '=', 'eventlog_tbl.byuser')
        ->leftjoin('users AS B', 'B.email', '=', 'eventlog_tbl.affectiveuser')
        ->select('eventlog_tbl.*','A.name as byuser_name','B.name as affectiveuser_name')
        ->get();

    print_r($res);

This is your query written using the Laravel query builder. 这是使用Laravel查询构建器编写的查询。

$events = DB::table('eventlog_tbl')
    ->select('eventlog_tbl.*', 'users_1.name', 'users_2.name')
    ->leftJoin('users AS users_1', 'users_1.email', '=', 'eventlog_tbl.byuser')
    ->leftJoin('users AS users_2', 'users_2.email', '=', 'eventlog_tbl.affectiveuser')
    ->get();

Edit: 编辑:

$events = DB::table('eventlog_tbl')
    ->select('eventlog_tbl.*', 'users_1.name AS user_1', 'users_2.name AS user_2')
    ->leftJoin('users AS users_1', 'users_1.email', '=', 'eventlog_tbl.byuser')
    ->leftJoin('users AS users_2', 'users_2.email', '=', 'eventlog_tbl.affectiveuser')
    ->get();

The problem is that both name columns are called the same thing. 问题在于两个名称列都被称为同一事物。 As per the accepted answer, these will need to be aliased differently too. 根据公认的答案,这些名称也将需要不同的别名。

Why don't you convert this to use relationships? 您为什么不将其转换为使用关系? I have probably got the relationships wrong, something like this: 我可能关系错了,像这样:

class EventLog extends Model
{
    public function byUser()
    {
        return $this->hasOne(User::class, 'byuser', 'id');
    }

    public function affectiveUser()
    {
        return $this->hasOne(User::class, 'affectiveuser', 'id');
    }
}

And then 接着

$event_log = EventLog::with(['byUser', 'affectiveUser')->all();


foreach ($event_log as $item) {
    echo $item->byUser->email();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM