如何使用Eager加载并加入雄辩的同时在laravel 4 [英] How to use Eager Loading and Join in Eloquent at a same time in laravel 4

查看:120
本文介绍了如何使用Eager加载并加入雄辩的同时在laravel 4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

模型

class WPModel extends Eloquent
{

    protected $table = 'work_processes';
    protected $guarded = array('id');
    protected $softDelete = true;

    // declaring one-to-many relationship
    public function relatedWPAQs()
    {
        return $this->hasMany('WPAQModel', 'wp_id');
    }

    public function relatedUsers()
    {
        return $this->belongsTo('UserModel', 'wp_owner_id');
    }

}

class UserModel extends Eloquent 
{
    protected $table = 'users';
    protected $softDelete = true;

    public function relatedWPs()
    {
        return $this->hasMany('WPModel', 'wp_owner_id');
    }
}

class WPAQModel extends Eloquent
{
    protected $table = 'wp_audit_questions';
    protected $fillable = array('wp_id', 'wp_audit_question');

    // declaring one-to-many relationship - the inverse way
    public function relatedWP()
    {
        return $this->belongsTo('WPModel', 'wp_id');
    }

    public function scopeWpParent($query, $id)
    {
        return $query->where('wp_id', '=' ,$id);
    }
}

控制器

class WPAQController extends BaseController
{
    public function showWPAQ($wpid)
    {
        $workprocess = WPModel::where('id', $wpid)
                                ->join('users', 'users.id', '=', 'work_processes.wp_owner_id')
                                ->select('users.user_name', 'work_processes.*')
                                ->with(array(
                                'relatedWPAQs' => function($query) use ($wpid)
                                    {
                                        $query->where('wp_id', '=',$wpid);
                                    }                                
                                ))
                                ->get();
        return View::make('wpaqshow')->with(compact('workprocess'));
    }
}

当我运行此代码,我收到以下错误

when I run this code, I get following error


SQLSTATE [23000]:完整性约束违规:1052
中的列'id'其中子句是不明确的(SQL:select 用户 user_name
work_processes 。* from work_processes inner join users on
users id = work_processes wp_owner_id 其中
work_processes deleted_at 为空, id =?)(Bindings:数组(
0 =>'1',))

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select users.user_name, work_processes.* from work_processes inner join users on users.id = work_processes.wp_owner_id where work_processes.deleted_at is null and id = ?) (Bindings: array ( 0 => '1', ))


推荐答案

以下:

$workprocess = WPModel::where('work_processes.id', $wpid)
                                ->join('users', 'users.id', '=', 'work_processes.wp_owner_id')
                                ->select('users.user_name', 'work_processes.*')
                                ->with(array(
                                'relatedWPAQs' => function($query) use ($wpid)
                                    {
                                        $query->where('wp_id', '=',$wpid);
                                    }                                
                                ))
                                ->get();

您加入了几张表。现在laravel有很多 Ids 。你必须告诉Laravel哪个 id 在Laravel应该使用的位置。

You have joined few tables. Now laravel has many Ids. You have to tell Laravel which id in where clause Laravel should use..

WPModel::where('id', $wpid)

这篇关于如何使用Eager加载并加入雄辩的同时在laravel 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆