使用关系访问数据 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->client_id = $client->projects()->attach($project->id); $client_project->save();
顺便说一句,我删除了 client_project 模型。但是,让我问你一件事。如果我没有模型,我将如何向 client_project 添加数据?
不,你不需要创建client_project()的对象。以上是关于使用关系访问数据 Laravel的主要内容,如果未能解决你的问题,请参考以下文章