使用关系访问数据 Laravel

Posted

技术标签:

【中文标题】使用关系访问数据 Laravel【英文标题】:Acces to data using relationships Laravel 【发布时间】:2018-01-11 00:50:34 【问题描述】:

我想使用 Laravel 上的关系访问控制器功能中的数据。

我先解释一下我的代码:

我有 3 个表、项目、客户和客户项目。

此时,client_project 没有任何关系,我只是手动添加它。

现在我想在 laravel 上使用关系,但这有点令人困惑(至少对我来说)。

我觉得projects和clients表的代码不太重要,只要有主键之类的id,还有一些字段就可以了。

我的 client_project 迁移如下所示:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreateClientProjectTable extends Migration 

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('client_project', function(Blueprint $table)
        
            $table->increments('id');
            $table->integer('client_id');
            $table->integer('project_id');
            $table->timestamps();
        );
    


    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::drop('client_project');
    


Client_Project 模型如下所示:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Client_Project extends Model

protected $fillable = ['client_id','project_id'];

public $table = 'client_project';


    public function clients()
    
        return $this->hasMany('App\Models\Project');
    
    public function projects()
    
        return $this->hasOne('App\Models\Client');
       


一个客户可以有多个项目,但一个项目只能由一个客户创建。我认为关系是好的。

(起初,我认为对于关系我不需要制作 client_project 表),但我认为这是一个错误的想法。我也想用这张桌子来做。

所以,现在,当我尝试调用函数控制器时,我想我可以使用 por 示例访问数据:

App\Models\Project::find(1),就像 laravel 的文档所说的那样。

函数是这样的:

$client = new Client();
$client->name = $request->input("nameClient");
$client->slug = $request->input("slugClient");
$client->priority = $request->input("priorityClient");
$client->save();

$client_project = new Client_Project();
$client_project->client_id = App\Models\Client::max('id');
$client_project->project_id = App\Models\Projects::max('id');
$client_project->save();

客户端的部分正在工作。我只是获取一些输入的值,然后创建一个新的。

问题在于 $client_project。我想让它动态化。我创建了客户端和项目,我的代码得到了项目的最后一个(更大的 id)和最后一个(更大的 id)。 我如何使用关系访问它们? 可能需要编辑 client_project 的迁移并在 project_id 或 client_id 中输入一些键?

如果需要更多信息,请询问。 任何帮助将不胜感激!

【问题讨论】:

你把事情复杂化了,你不需要client_project表(这种类型的表在许多对多的关系中使用),你只需在你的项目表中添加client_id行并在客户端项目之间建立关系。但是,如果您也想要第三张表,那么只需将其设置为多对多关系(您不需要 ClientProject 模型,您可以在 Client 和 Project 模型中建立关系 - 多对多)。 您可以使用 $client->id 获取最后插入的客户端 ID。这样,如果您有多个用户同时插入,则它会变为错误值。 @Autista_z 你能回答我的代码看起来如何吗?我想我只会用两个表来做,并为各自的 id 添加 1 个字段。 【参考方案1】:

这是你的答案。您正在为客户和项目创建数据透视表的好方法,因此您可以将尽可能多的项目附加到任何客户。这是与模型的关系。

客户端模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Client extends Model

    public function projects() 
        return $this->belongsToMany(Project::class,'client_project');
     
   

项目模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Projects extends Model




    public function client() 
        return $this->belongsToMany(Client::class,'client_project');
     


   

?>

对于保存项目ID,在控制器方法中使用以下方式

    $client = new Client();
    $client->name = $request->input("nameClient");
    $client->slug = $request->input("slugClient");
    $client->priority = $request->input("priorityClient");
    $client->save();
    $project = new Project();
//include fields as per your table 

    $project->save();

    $client->projects()->attach($project->id);

【讨论】:

嗨@Shashikant Chautan 我不能用 2 张桌子来做,前端代码是为 3 张桌子设计的,我不能碰它。模型现在看起来就像我发布答案时一样,但我试图在控制器中获取 id 值。在控制器中,我必须创建新的 Client_Project。我如何看待这些价值观? 看它已经使用了三个表看代码。您创建了不需要的数据透视表模型。 是的,对不起。那么,我能做到吗? $client_project = new Client_Project(); $client_project-&gt;client_id = $client-&gt;projects()-&gt;attach($project-&gt;id); $client_project-&gt;save(); 顺便说一句,我删除了 client_project 模型。但是,让我问你一件事。如果我没有模型,我将如何向 client_project 添加数据? 不,你不需要创建client_project()的对象。

以上是关于使用关系访问数据 Laravel的主要内容,如果未能解决你的问题,请参考以下文章

使用关系访问数据 Laravel

5. Spring使用JDBC访问关系数据

使用 JDBC 和 Spring 访问关系数据

使用Spring Data JPA访问关系型数据库

使用Spring Data JPA访问关系型数据库

使用 JOIN 访问 NSPredicate 中的核心数据实体关系