根据关系表获取特定列

时间:2017-04-12 14:43:35

标签: laravel eloquent laravel-5.2 laravel-5.3

我目前的表格与翻译有关。

Languages:
- id;
- name;

Products:
- id;
- online;
- price;

Products_Translations:
- id;
- product_id;
- name;
- description;
- language_id;

但我有两件事要做。首先,我有一个页面可以检索我的所有产品,并且可以轻松地在我的模型Product中创建与Products_Translations的关系并获取信息。然后只是在foreach循环中使用它的情况。

但我认为更好的方案是将所有产品信息放在同一个查询中,然后从product表中“在线”,“价格”中检索所有信息中的所有信息。 '并从表products_translation''name','description'和'language_id'。

我以前的代码就像

控制器:

$products = Product::all();

查看:

@foreach($products as $product)
     @foreach($product->translatedProducts as $prod)

        some code

     @endforeach
@endforeach 

产品型号:

public function translatedProducts() {
    return $this->hasMany(ProductTranslation::class);
}

在这种方法中,我的产品信息在不同的地方分开。理想的情况就是我控制器调用产品并接收所有产品详细信息的所有集合对象。

我用过这个解决方案:

$products = DB::table('products')
            ->join('product_translations', 'products.id', '=', 'product_translations.product_id')
            ->select('products.*', 'product_translations.name', 'product_translations.description','product_translations.description','product_translations.locale')
            ->get();

但更优雅的是使用这种逻辑而不是在控制器上但在模型产品中

2 个答案:

答案 0 :(得分:0)

根据您的相关信息,我假设产品和语言模型具有ManyToMany关系,这意味着产品具有多种语言,并且语言具有许多产品。因此,您不需要涉及另一个翻译术语来混淆laravel。 请执行以下步骤:

我建议您一起创建模型和迁移文件:

php artisan make:model --migration Product

将创建products表,第一个字符为小写。

php artisan make:model --migration Language

将创建Language模型和languages表。 并创建数据透视表:请注意数据透视表是product_language而不是Products_Translations

模型中的第二个定义如下:

在产品型号中:

public function languages(){
    return $this->belongsToMany(Language::class)->withPivot('name', 'description');
}

并在您的语言模型中:

public function products(){
    return $this->belongsToMany(Product::class)->withPivot('name', 'description');
}

现在您的设置已完成。 如果您希望产品具有languages的所有关系,那么您需要:

$products = Product::with('languages')->get();

这将加速关系。您可以参考有关预先加载的laravel文档。

现在您可以在模板中使用:

@foreach($products as $product)
    @foreach($product->languages as $language)
        //code here
    @endforeach
@endforeach

如果您想在数据透视表(language_product)中获取列,则可以使用:

$product->pivot->name;

$language->pivot->name;

另一种方法可以是创建一个具有oneToMany关系的LanguageProduct模型ProductLanguages模型,但我建议首选。它更优雅,laravel为它提供了许多方法。

我希望我的回答符合您的需求。如有任何问题,请告诉我。我在这里回答。

此致

答案 1 :(得分:0)

我认为您可以使用pluck然后groupBy使用whereIn来解决您的问题。

<强>控制器:

$products = Product::all();
$products_id = $products->pluck('id');
$transls = ProductsTranslations::where('language_id', $lang_id)
                                ->whereIn('id', $likeable_id)
                                ->get()
                                ->groupBy('product_id');

查看:

@foreach($products as $product)
    {{ $transls[$product->id][0]->name }} {{ $transls[$product->id][0]->description }}
@endforeach