gpt4 book ai didi

php - 多对多关系 Laravel 4

转载 作者:行者123 更新时间:2023-11-29 00:10:15 24 4
gpt4 key购买 nike

我正在开发一个 laravel-4 应用程序。目前它很好地结合在一起,我一直在努力定义数据库的各个表之间的关系。但是,我遇到了一个我无法解决的问题。

在我的数据库中有一个资源表和标签表。它们之间存在多对多关系,因此我还有一个 resource_tags 表,其中两个表 id 作为 外键

现在,当我根据用户通过表单提供的数据创建资源时,我会创建资源、检查类型并决定操作。然后我检索资源的标签并循环遍历它们并在 Tags 表中创建一个条目。

我的问题是将信息放入 resource_tags 表。有没有一种方法可以让我相对轻松地做到这一点?

这是我的处理表单提交的 Controller :

class SharedResourcesController extends BaseController {
//Add a shared Resource to the DB
//To do: Error checking and validation.
public function handleResource(){

//Create Object
$resource = new SharedResource;
$resource->title = Input::get('title'); //Title of resource
$resource->user_id = Input::get('user_id'); //User who uploads
$resource->book_id = Input::get('book_id'); //Book it is associated with
$resource->type_id = Input::get('type_id'); //Type of resource

//STORE LINKS
//if type is link... 1
if($resource->type_id == "1"){
$resource->web_link = Input::get('link');
}
//if type is video...2
if($resource->type_id == "2"){
$resource->vid_link = Input::get('link');
}
//UPLOADING
//If type is doc...3
if($resource->type_id == "3"){
if(Input::hasFile('file')){
$destinationPath = '';
$filename = '';
$file = Input::file('file');
$basename = Str::random(12);
$extension = $file->getClientOriginalExtension();
$destinationPath = public_path().'/file/';
$filename = Str::slug($basename, '_').".".$extension;//Create the filename
$file->move($destinationPath, $filename);
$resource->doc_link = $filename;
}
}
//if type is img...4
if($resource->type_id == "4"){
if(Input::hasFile('file')){
$destinationPath = '';
$filename = '';
$file = Input::file('file');
$basename = Str::random(12);
$extension = $file->getClientOriginalExtension();
$destinationPath = public_path().'/img/uploads/';
$filename = Str::slug($basename, '_').".".$extension;//Create the filename
$file->move($destinationPath, $filename);
$resource->img_link = $filename;
}
}

//TAGS
//Get the tags
$tags = Array();
$tags = explode(',', Input::get('tags'));
foreach($tags as $tag){
//Create a new Tag in DB - TO DO: Only Unique TAGS
$newTag = new Tag;
$newTag->name = $tag;
$newTag->save();
//Enter to resource tags
}

//Entry to resouce_tags

//Save Object
$resource->save();
return Redirect::action('User_BaseController@getSharedResources')->with('success', 'Resouce Created!');

//Any errors return to Form...
}
}

模型

class SharedResource extends Eloquent{
//set up many to many
public function tags(){
return $this->belongsToMany('Tag');
}

class Tag extends Eloquent{
//set up many to many
public function sharedResources(){
return $this->belongsToMany('SharedResource');
}

我知道在验证和错误处理方面有很多缺失,但我只是想让流程正常运行,我可以在以后修改它。我将不胜感激任何帮助。

最佳答案

您所要做的就是构建或获取资源并构建或获取标签,然后在资源的标签关系上调用 saveMany 并将标签项数组传递给它,如下所示(伪代码示例):

$resource = Resource::create(['name' => 'Resource 1']);
$tag = [];
for ($i = 5; $i > 0; $i--) {
$tag = Tag::create(['name' => 'Tag '.$i]);
array_push($tags, $tag);
}
$resource->tags()->saveMany($tags);

$tags 必须是 Tag 对象的数组,调用关系的 saveMany 将为您处理数据透视表插入。您最终应该在 resources 表中得到一个 Resource 1 资源,在 tag 表中得到五个 Tags,在 resource_tag 表中得到 5 条记录并保存了关系。

关于php - 多对多关系 Laravel 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25527655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com