【问题标题】:Laravel 4 - relationshipsLaravel 4 - 关系
【发布时间】:2014-08-23 07:56:16
【问题描述】:

我有两个表格:“文章”和“图片”。在我的Articles 我有:

 `...
'body'
'image-1'
'image-2'
'image-3'
'image-4'
 ...`

我想将每篇文章与存储在我的数据库中的一张、两张、三张……图像相关联。而且,当然,所有图像都可以用于一篇以上的文章。

我的问题是我应该在它们之间使用哪种关系。我不知道使用数据透视表article_image (belongsToMany) 是否会更好,或者我是否使用其他类型的关系做得很好。那样的话……那样就好了?:

ImageModel.php

public function article()
    {       
        return $this->hasMany('Article', 'article_id');
    }

ArticleModel.php

public function image()
    {       
        return $this->hasMany('Image', 'image_id');
    }

编辑:

那么,如果我使用数据透视表...我应该在数据透视表中使用一些额外的列吗?喜欢...

$table->increments('id');
$table->integer('article_id')->unsigned()->index();
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
$table->integer('image-1')->unsigned()->index();
$table->foreign('image_id')->references('id')->on('images')->onDelete('cascade');
$table->integer('image-2')->unsigned()->index();
$table->foreign('image_id')->references('id')->on('images')->onDelete('cascade');
...
$table->timestamps();

我想我应该删除onDelete('cascade')以避免删除图片时丢失我的文章?

编辑 2:

在我的控制器中,我以这种方式保存图像:

if(Session::get('imagen_1')){
                $imagen = new Imagen;
                $imagen->url = Session::get('imagen_1');
                $imagen->user_id = Sentry::getUser()->id;
                $imagen->save();    

                Session::forget('imagen_1');    

            }

然后,我创建我的article(我称之为“actividad”)

$actividad = new actividad;
            $actividad->titulo = Input::get('titulo');
            $actividad->actividad = Input::get('actividad');            
            (...)
            $actividad->slug = Str::slug(Input::get('titulo'));
            $actividad->user_id = Sentry::getUser()->id;

            $actividad->save();

最后,我尝试保存两者之间的关系:

$actividad->imagens()->sync($imagen);

但它不起作用...我收到下一条错误消息:

参数 1 传递给 Illuminate\Database\Eloquent\Relations\BelongsToMany::formatSyncList() 必须是数组类型,给定对象,调用 /Applications/XAMPP/xamppfiles/htdocs/webs/lara4/edu1/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php 在第 578 行并定义

【问题讨论】:

  • 不要那样做。你最终会在文章上看到几个belongsTo,在图片上看到几个hasMany。创建数据透视表并改用belongsToMany,这正是您需要的。
  • 我会考虑您是否要搜索具有特定图像的帖子。这不是一个非常常见的用例。如果不是,那么只有文章的单向关系有很多图像。如果您确实需要另一种关系(图片->文章),那么正如 Jarek_Tkaczyk_deczo 所说,使用数据透视表在两种关系上都属于多个。
  • @JarekTkaczyk_deczo_ 我已经编辑了我的问题。请问有什么建议吗?

标签: laravel-4 relationship has-many has-and-belongs-to-many


【解决方案1】:

带有附加数据透视表数据 (primary) 的基本设置,向您展示如何使用它:

// DB
articles: id, title ... timestamps
images: id, url ... timestamps
article_image: id, article_id, image_id, primary, timestamps


// Article
public function images()
{
 return $this->belongsToMany('Image');
}

public function primaryImages()
{
 return $this->images()->wherePivot('primary', 1);
}

// Image
public function articles()
{
 return $this->belongsToMany('Article')->withPivot('primary');
}

// usage
$article->images; // collection

$article->images(); // relation object you can chain query methods on:
$article->images()->where(..)->orderBy(..)->get();

$images->articles; // collection

$article->primaryImages; // collection of related images with pivot primary=1

$image->articles->first()->pivot->primary; // value of the pivot field

// eager loading only chosen images:
$articles = Article::with(['images' => function ($q) {
  $q->wherePivot('primary', 0);
})->get();

// fetch only articles that have any image
$articles = Article::has('images')->get();

等等..

【讨论】:

  • 我不知道我是否理解正确,但我需要为每篇文章中的每张图片(image-1,image-2,image-3,image-4)命名,以在我看来正确显示它。所以,也许我应该在我的 pivot_table 中创建 4 个额外的列('image-1'、'image-2'...)而不是 primary 列?我有一个表单来创建一篇文章,我可以在其中存储 4 张图片,我想将每个人都存储在它的位置...
  • 绝对不是,只需添加一些逻辑来处理添加不超过 4 个图像,仅此而已。每张图片都有一列是非常糟糕的主意。想象一下,有一天您决定每篇文章将有 5、10 或您喜欢的任何数量的图像。如果您需要订购这些图像,则添加 order 列并在那里存储 1,2,3,4。
  • 我在写完评论后刚刚得出了同样的结论......但我正在疯狂地尝试保存与我的文章相关的图像。我要编辑我的问题。如果你能看看并告诉我我做错了什么,我将不胜感激......
  • attach 采用单个 id 或 model 作为参数,而 sync 采用 id 数组或模型集合。所以你只需要在这种情况下使用附加。还要注意sync 默认情况下会重置以前的关系,而attach 会添加新关系,即使可能已经附加了 2 个模型。
猜你喜欢
  • 2013-08-16
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2016-02-12
  • 2015-06-01
  • 2013-10-21
  • 2014-08-30
相关资源
最近更新 更多