【问题标题】:laravel eloquent get related tasks based on a auth user and project idlaravel eloquent 根据 auth 用户和项目 id 获取相关任务
【发布时间】:2014-11-04 15:34:46
【问题描述】:

嗨,我很困惑我应该如何编写雄辩的查询要获取项目所属的相关客户,这是在projectstasksclient_id 理想情况下我想访问此页面app.dev/project/3/tasks 这样很简单,可以路由到:

Route::any("project/{resource}/tasks", [
        "as"   => "project/projectrelatedtasks",
        "uses" => "ProjectController@projectrelatedtasks"
    ]);

我不确定编写此查询的最简单方法是什么,我可以轻松地在下面批量获取所需的内容,就像在我的存储库中一样:

public function getProjectTasks() {
//This fetches the auth users projects, the client to who it belongs and its related tasks
//not sure how to insert another find with $id 
    return \User::with(array('projects', 'projects.clients', 
    'projects.tasks'))->find(Auth::user()->id);
}

这在我的控制器中:

public function projectrelatedtasks() {
            $projects = $this->project->getProjectTasks();
            return $projects;
        }

但我想通过它的 id 将其限制为一个项目,不确定执行此查询的最佳和最有效的方法是什么,有人可以帮我解决这个问题吗?谢谢

编辑

存储库:

public function getProjectTasks($id) {

    return \Projects::with(['clients', 'tasks'])
        ->whereUserId(Auth::user()->id)
        ->find($project_id);
}

路线:

Route::any("project/{resource}/tasks", [
        "as"   => "project/projectrelatedtasks",
        "uses" => "ProjectController@projectrelatedtasks"
    ]);

控制器:

public function projectrelatedtasks($id)
    {

    // get the Project tasks
        $project = $this->project->getProjectTasks($id);
        return $project;        
    }

错误日志:

[2014-09-10 20:56:50] production.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /media/sf_Sites/tempus/bootstrap/compiled.php:5687
Stack trace:
#0 /media/sf_Sites/tempus/bootstrap/compiled.php(5004): Illuminate\Routing\RouteCollection->match(Object(Illuminate\Http\Request))
#1 /media/sf_Sites/tempus/bootstrap/compiled.php(4992): Illuminate\Routing\Router->findRoute(Object(Illuminate\Http\Request))
#2 /media/sf_Sites/tempus/bootstrap/compiled.php(4984): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#3 /media/sf_Sites/tempus/bootstrap/compiled.php(717): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#4 /media/sf_Sites/tempus/bootstrap/compiled.php(698): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))
#5 /media/sf_Sites/tempus/bootstrap/compiled.php(7706): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true)
#6 /media/sf_Sites/tempus/bootstrap/compiled.php(8309): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true)
#7 /media/sf_Sites/tempus/bootstrap/compiled.php(8256): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true)
#8 /media/sf_Sites/tempus/bootstrap/compiled.php(10895): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true)
#9 /media/sf_Sites/tempus/bootstrap/compiled.php(659): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request))
#10 /media/sf_Sites/tempus/public/index.php(49): Illuminate\Foundation\Application->run()
#11 {main} [] []

错误日志 2

[2014-09-10 21:01:58] production.ERROR: exception 'ErrorException' with message 'Undefined variable: project_id' in /media/sf_Sites/tempus/app/Acme/Repositories/DbProjectRepository.php:64
Stack trace:
#0 /media/sf_Sites/tempus/app/Acme/Repositories/DbProjectRepository.php(64): Illuminate\Exception\Handler->handleError(8, 'Undefined varia...', '/media/sf_Sites...', 64, Array)
#1 /media/sf_Sites/tempus/app/controllers/ProjectController.php(40): Acme\Repositories\DbProjectRepository->getProjectTasks('55')
#2 [internal function]: ProjectController->projectrelatedtasks('55')
#3 /media/sf_Sites/tempus/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(231): call_user_func_array(Array, Array)
#4 /media/sf_Sites/tempus/bootstrap/compiled.php(5784): Illuminate\Routing\Controller->callAction('projectrelatedt...', Array)
#5 /media/sf_Sites/tempus/bootstrap/compiled.php(5772): Illuminate\Routing\ControllerDispatcher->call(Object(ProjectController), Object(Illuminate\Routing\Route), 'projectrelatedt...')
#6 /media/sf_Sites/tempus/bootstrap/compiled.php(4971): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'ProjectControll...', 'projectrelatedt...')
#7 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}('55')
#8 /media/sf_Sites/tempus/bootstrap/compiled.php(5330): call_user_func_array(Object(Closure), Array)
#9 /media/sf_Sites/tempus/bootstrap/compiled.php(4996): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))
#10 /media/sf_Sites/tempus/bootstrap/compiled.php(4984): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#11 /media/sf_Sites/tempus/bootstrap/compiled.php(717): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#12 /media/sf_Sites/tempus/bootstrap/compiled.php(698): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))
#13 /media/sf_Sites/tempus/bootstrap/compiled.php(7706): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true)
#14 /media/sf_Sites/tempus/bootstrap/compiled.php(8309): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true)
#15 /media/sf_Sites/tempus/bootstrap/compiled.php(8256): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true)
#16 /media/sf_Sites/tempus/bootstrap/compiled.php(10895): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true)
#17 /media/sf_Sites/tempus/bootstrap/compiled.php(659): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request))
#18 /media/sf_Sites/tempus/public/index.php(49): Illuminate\Foundation\Application->run()
#19 {main} [] []

【问题讨论】:

  • 所以你想通过它的id获取一个项目,前提是它属于user
  • 是的,但我也想检索它的相关客户端,以便将其输出到前端@Kousha
  • 好的,请稍等。我正在写解决方案
  • 其实有个问题:你为什么从User开始?为什么不直接从Project 开始呢?应该有一个数据透视表或已经将 User 链接到 Project 的东西
  • @Kousha 是的,我在项目表中有一个 user_id,所以我想我可以从项目开始,但是我将如何查询两个 id,这就是我真正困惑的地方

标签: laravel eloquent has-many belongs-to relationships


【解决方案1】:

您可以使用闭包将参数传递给with 内的表:

// Assume $project_id is defined as the id of the project of interest
$user = User::with([
    'projects' => function($query) use ($project_id)
    {
        return $query->whereId($project_id);
    },
    'projects.clients',
    'projects.tasks'
])->find(Auth::user()->id);

但您应该从Project 本身开始,因为表projects 有一个列user_id

// Again, assuming $project_id is defined
Projects::with(['clients', 'tasks'])
        ->whereUserId(Auth::user()->id)
        ->find($project_id);

【讨论】:

  • 感谢@kousha,我已经尝试过了,但出现了这个错误:production.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /media/sf_Sites/tempus/bootstrap/compiled.php:5687 Stack trace: 我已经用我使用过的代码更新了我的问题
  • @g_9020,这是一个路由问题,而不是控制器问题。我现在就检查你的路线。在此期间,再次查看您的路由并确保一切设置正确。
  • 对不起,我已经修复了路由我现在有一个不同的错误类项目现在发现未定义的变量
  • @g_9020,您的路线不包含通配符($id)。因此,例如,您提供的路径 project/projectrelatedtasks/23 根本没有路由。看看这个页面laravel.com/docs/routing
  • @g_9020,是的,因为您将变量 getProjectTasks() 传递给函数 $id,但在查询中您使用的是 $project_id!把它们改成同一个变量~!
猜你喜欢
  • 2014-01-20
  • 2014-12-07
  • 1970-01-01
  • 2013-12-14
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多