【问题标题】:Laravel 4 and Eloquent, hasMany relation seems not workLaravel 4 和 Eloquent,hasMany 关系似乎不起作用
【发布时间】:2014-04-29 00:49:36
【问题描述】:

我有 2 个模型

class Product extends Eloquent {

    protected $table = 'products';

    public function product_data() {
        return $this->hasMany('Product_translate','id_product');
    }

}

和

class Product_translate extends Eloquent {

    protected $table = 'product_translates';

    public function product() {
        return $this->belongsTo('Product','id_product');
    }

}

在我的控制器中,如果我尝试使用 Eloquent:

class PublicController extends BaseController {

    public function home() 
    {
        $products = Product::find(1)->product_data;

        $queries = DB::getQueryLog();
        $last_query = end($queries);

        echo "<pre>";

        print_r($last_query);
        print_r($products);

        echo "</pre>";
    }

}

这是我得到的:

Array
(
    [query] => select * from `tp450products` where `id` = ? limit 1
    [bindings] => Array
        (
            [0] => 1
        )

    [time] => 0.88
)

您看不到任何结果,只有查询(在 phpmyadmin 中正确运行),

但如果我尝试仅使用 find(1) 来使用更改:

class PublicController extends BaseController {

        public function home() 
        {
            $products = Product::find(1);

            $queries = DB::getQueryLog();
            $last_query = end($queries);

            echo "<pre>";

            print_r($last_query);
            print_r($products);

            echo "</pre>";
        }

    }

我获得了表“products”的记录,但我想获得与“product_translates”的连接。 不知道出了什么问题!

数据库已正确链接,“product_translates”具有正确的外键

这里有两张表(每张只有一条记录):

Products
id | type | best | featured | voto | created_at          | updated_at
1  | 1    | 0    | 0        | 0    | 2014-03-19 00:00:00 | 2014-03-12 13:26:23

Product_translates
id | id_product | id_lang | nome              | slug
1  | 1          | 1       | mutande ascellari | mutande-ascellari

编辑 1

使用查询生成器没有问题,但为什么使用 Eloquent ORM 我有这个问题?

类 PublicController 扩展 BaseController {

public function home() 
{
    $products = DB::table('products')->leftJoin('product_translates','product_translates.id_product','=','products.id')->get();

    $queries = DB::getQueryLog();
    $last_query = end($queries);

    echo "<pre>";

    print_r($last_query);
    print_r($products);

    echo "</pre>";
}

}

【问题讨论】:

    标签: mysql select join laravel-4 eloquent


    【解决方案1】:

    尝试执行此操作,看看你会得到什么:

    class PublicController extends BaseController {
    
        public function home() 
        {
            $product = Product::find(1);
            $p1 = Product::with('product_data')->where('id',1)->get();
    
            echo "<pre>";
    
            echo '---- Product';
            var_dump($product);
    
            echo '---- Product data values';
            var_dump($product->product_data);
    
            echo '---- Product data query';
            var_dump($product->product_data());
    
            echo '---- Product data eager loaded';
            var_dump($p1);
    
            echo "</pre>";
        }
    
    }
    

    【讨论】:

    • 是的对不起,我的错我从我的代码中复制了错误的字符串,我使用的方法确实是 di product_data。问题已更新
    • errr nope...这提供了大量的数据,不确定我看到了什么...无论如何,谢谢,我认为问题与方法的名称有关,我是做一些实验
    • 你能粘贴这个数据吗?我只是放了一些头文件,以便于调试。
    • 一些数据丢失,'---- Product data eager loaded' 没有出现。
    【解决方案2】:

    这个问题让我死了很久..这是一个真正的解决方案

    Product_translate 的模型名称应该是 ProductTranslate ,然后你不需要设置表名属性...命名在指定类名和(多名称部分)的 eloquent 中是如此重要.. 解决方案如下:

    //file models/Product.php
    class Product extends Eloquent 
    
        // in this name glass you well get $product->product_translates property 
        // gift  from eloquent dynamic property!!
        public function productTranslates() {
            return $this->hasMany('ProductTranslate');
        }
    }
    
    //file models/Product.php
    class ProductTranslate extends Eloquent {
    
        public function product() {
            return $this->belongsTo('Product');
        }
    }
    
    
    // this will be work now!!
    class PublicController extends BaseController {
    
        public function home() 
        {
            $products = Product::find(1);
    
            foreach($products->product_translates as $product_translate)
                 echo $product_translate->name . " <br> ";
    
            $translates = ProductTranslate::All();
    
            foreach($translates as $translate)
                 echo $translate->name. ": ". $translate->product->price . " <br> ";
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 2015-04-19
      • 1970-01-01
      • 2016-03-17
      • 2020-03-27
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      相关资源
      最近更新 更多