douyouchou1085 2019-02-15 23:41
浏览 22

重复作为一种关系

I have a model called debtors. I'd like to have a relationship for all other debtors with the same phone_home and phone_work attributes.

I know I can do this:

public function dupes_phone_home()
{
    return $this->hasMany('App\Debtor', 'phone_home', 'phone_home');
}

public function dupes_phone_work()
{
    return $this->hasMany('App\Debtor', 'phone_work', 'phone_work');
}

How can I merge these two relationships into one so it can be used in eager loading, etc.?

Edit: example of what I want:

$debtor1 = Debtor::create([
    'name' => 'Joe Blow',
    'phone_home' => '123',
    'phone_work' => '456',
]);

$debtor2 = Debtor::create([
    'name' => 'Joe Blow Dupe 1',
    'phone_home' => '123',
    'phone_work' => '789',
]);

$debtor3 = Debtor::create([
    'name' => 'Joe Blow Dupe 2',
    'phone_home' => null,
    'phone_work' => '456',
]);

$joe_with_dupes = Debtor::with('dupes')->get()->toArray();

Would give me something like:

[
    'name' => 'Joe Blow',
    'phone_home' => '123',
    'phone_work' => '456',
    'dupes' => [
        [       
            'name' => 'Joe Blow Dupe 1',
            'phone_home' => '123',
            'phone_work' => '789',
        ],
        [       
            'name' => 'Joe Blow Dupe 2',
            'phone_home' => null,
            'phone_work' => '456',
        ],
    ],
],
[
    'name' => 'Joe Blow Dupe 1',
    'phone_home' => '123',
    'phone_work' => '789',
    'dupes' => [
        [       
            'name' => 'Joe Blow',
            'phone_home' => '123',
            'phone_work' => '456',
        ],
    ],
],
...
  • 写回答

1条回答 默认 最新

  • dqrl3595 2019-02-16 03:03
    关注

    You could join this two relationships like this:

    class Debtor extends Model
    {
        public function debtors()
        {
            return Debtor::where(function ($query) {
                return $query->where('phone_home', $this->phone_home)
                           ->orWhere('phone_work', $this->phone_work);
            }
        }
    
        public function getDebtorsAttribute()
        {
            return $this->debtors()->get();
        }
    
        // your relationships
    }
    

    Note

    This might not work with eager loading, so you could add this attribute (debtors) to your $appends = []; model config, but given that this relationships are a little bit off (same value for foreign and parent keys) this could lead to a recursive problem.

    评论

报告相同问题?

悬赏问题

  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 正弦信号发生器串并联电路电阻无法保持同步怎么办
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序