功能无法加载有很多关系数据 laravel Model Eloquent

Posted

技术标签:

【中文标题】功能无法加载有很多关系数据 laravel Model Eloquent【英文标题】:With function not working to load has many relation data laravel Model Eloquent 【发布时间】:2018-10-25 00:18:43 【问题描述】:

我有这两个模型。 此电话模型是一种常见的模型,可用于为用户、客户、员工等保存和获取电话值。所以meta_value用来保存相关模型的id,meta_key用来确定模型名称关系。

/* Customer Model*/
namespace App;    
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Customer extends Model 
    /**
     * Get the Phone List.
     */
    public function phones()
        return $this->hasMany('App\Phone','meta_value', 'id')
                    ->select('id as phone_id','contact_number as phone','contact_number','country_code','type','dial_code')
                    ->where('meta_key','customer');
    

/* Phone Model*/
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;


class Phone extends Model 
    /**
     * Get the customer that owns the phone.
     */
    public function customer()
        return $this->belongsTo('App\Customer', 'meta_value');
    

我无法获取带有客户数据的手机数据。它总是返回

[relations:protected] => Array
    (
        [phones] => Illuminate\Database\Eloquent\Collection Object
            (
                [items:protected] => Array
                    (
                    )

            )

    )

在我的控制器中,我执行以下代码。

/*This is the case when I want to get the data for a single customer.*/
        $customer = Customer::find('448')->with('phones')->get();
        print_r($customer); // It will return all customers with no phones value.

        $customer = Customer::find('448');
        print_r($customer);die; // It will return a single customer whose id is 448 with no phones value.

        print_r($customer->phones);die; // I can get the values of phones by this

        $customer = Customer::find('448')->with('phones');
        print_r($customer);die; // It will crash my postman when i hit this.

        /*This is the case when I want to get the data for multiple customers.*/
        $customers = Customer::where('id', '>', '447')->with('phones')->get();
        print_r($customers);die; // It will return multiple customer with empty phones value.

        // However when I iterate through the loop and get phones then I can get the phone value. 
        $customers = Customer::where('id', '>', '447')->get();
        foreach ($customers as $customer) 
            $customer->phones = $customer->phones;
        
        print_r($customers);die;

只有迭代有效,但我认为这不是一个好的解决方案。即使我尝试加载功能但无法正常工作。

【问题讨论】:

不工作@MKhalidJunaid 【参考方案1】:

您必须选择所需的外键列meta_value

->select('id as phone_id','contact_number as phone','contact_number','country_code',
    'type','dial_code','meta_value')

对于单个客户,您不需要预先加载:

$customer = Customer::find(448);
$phones = $customer->phones;

您也应该使用polymorphic relationships。

【讨论】:

非常感谢@Jonas Staudenmeir 你拯救了我的一天。我只需要在客户模型中更新我的选择数组并添加“元值”字段。我也会接受你的回答。【参考方案2】:

虽然我怀疑选择 phone_idid 可能会影响查询检查关系,但快速调试是将其从相关函数中删除:

->select('id as phone_id','contact_number as phone','contact_number','country_code','type','dial_code')
                ->where('meta_key','customer');

让函数phones简单,

public function phones()
    return $this->hasMany('App\Phone','meta_value', 'id');

~更新~

那么,您需要改用load

如果您稍后需要进一步检查关系,则传递回调以对其进行过滤:

$customer = Customer::find('448')->load(['phones' => function($query) 
    $query->where('meta_key','customer');
]);

或者:

$customer = Customer::with(['phones' => function($query) 
    $query->where('meta_key','customer');
])->find('448');

最初的问题是:

find 的结果上使用withget 会为新查询创建另一个模型实例,因此您只会获得客户的所有记录。您可以使用load 方法,或者如果您将使用with,那么您必须在查询函数的末尾设置过滤器。

为了更好的理解,请查看Laravel documentation on Eager Loading

【讨论】:

这个解决方案也是返回空对象, 不要关闭。 你确定这个关系是正确的$this->hasMany('App\Phone','meta_value', 'id'); 是的,这个关系 $this->hasMany('App\Phone','meta_value', 'id') 是正确的,否则迭代永远不会工作 是的,它是正确的。您是否检查了我对答案所做的更正?

以上是关于功能无法加载有很多关系数据 laravel Model Eloquent的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:无法添加记录多对多关系

无法在 Controller Laravel belongsToMany 关系中获取正确的数据 - Laravel / Eloquent [关闭]

Laravel 约束急切加载 - 如果关系列应用限制!= 1

laravel eloquent - 在嵌套急切加载的关系上不使用

Laravel - 渴望加载多态关系的相关模型

laravel 中无法获取关系数据