【问题标题】:Laravel. Keep eloquent relationship after join拉拉维尔。加入后保持口才关系
【发布时间】:2015-10-04 10:51:43
【问题描述】:


突然间我遇到了我自己无法解决的问题。我写了查询,它返回了一些数据:

$users = User::whereIn('users.status', array(2,3))
    ->leftJoin('firsts', 'firsts.user_id', '=', 'users.id')
    ->leftJoin('seconds', 'seconds.user_id', '=', 'users.id')
    ->leftJoin('thirds', 'thirds.user_id', '=', 'users.id')
    ->leftJoin('offers', 'offers.user_id', '=', 'users.id')
    ->where(function($query){
        $query->where('users.status', '=', '2');
        $query->where('firsts.status', '=', 'approved');
        $query->where('seconds.status', '=', 'approved');
        $query->where('offers.user_id', '=', 'approved');
    })
    ->orWhere(function($query){
        $query->where('users.status', '=', '3');
        $query->where('users.stripe_active', '=', '1');
        $query->where('firsts.status', '=', 'approved');
        $query->where('seconds.status', '=', 'approved');
        $query->where('thirds.status', '=', 'approved');
        $query->where('offers.status', '=', 'approved');
    })
    ->get();

我期待一个简单的对象作为查询的返回。目前,我的 users 表中有一个正确的记录,但是这个查询向我返回了 6 次该对象,我不明白为什么。
我期望的结果:

Collection {#353 ▼
  #items: array:1 [▼
    0 => User {#354 ▼
      #dates: array:2 [▶]
      #table: "users"
      #fillable: array:3 [▶]
      #hidden: array:2 [▶]
      +admin: "eval.butkus@gmail.com"
      +admin2: "Evaldas"
      #connection: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:31 [▼
        "id" => 1
        "username" => "evaldas"
        "password" => "$2y$10$ARTGHBTqIl/X6UsblylF5ugMPFlASwDKUEVbS5Nh3TjtycGG/NU7."
        "email" => "eval.butkus@gmail.com"
        "remember_token" => "A42ezMckkvjCLrpj4jxyHf2iSQWp3iAGfzGoTqMygDimFSzXNx6FW42qCOhP"
        "name" => ""
        "subscribe" => 0
        "profile_picture" => "VNlQxOlCbXkCGEQ6ZdFS1pbK2tixhsmmhQPhLNLMBRKqDzXegWbqQiJOsplMADKg.jpg"
        "about_you" => ""
        "writing_service" => 0
        "f_card" => 0
        "logo" => ""
        "website" => ""
        "youtube" => ""
        "status" => 3
        "code" => ""
        "active" => 1
        "address" => ""
        "phone" => ""
        "news" => 0
        "terms" => 1
        "radius" => 0
        "created_at" => "2015-07-13 10:26:47"
        "updated_at" => "2015-07-15 10:25:30"
        "stripe_active" => 1
        "stripe_id" => "cus_6c0xE8OxR7fdXJ"
        "stripe_subscription" => "sub_6c0x4RzEoBplCb"
        "stripe_plan" => "small"
        "last_four" => "4242"
        "trial_ends_at" => null
        "subscription_ends_at" => null
      ]
      #original: array:31 [▶]
      #relations: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
    }
  ]
}

我得到的结果:

Collection {#364 ▼
  #items: array:6 [▼
    0 => User {#365 ▼
      #dates: array:2 [▶]
      #table: "users"
      #fillable: array:3 [▶]
      #hidden: array:2 [▶]
      +admin: "eval.butkus@gmail.com"
      +admin2: "Evaldas"
      #connection: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:53 [▼
        "id" => 2
        "username" => "evaldas"
        "password" => "$2y$10$ARTGHBTqIl/X6UsblylF5ugMPFlASwDKUEVbS5Nh3TjtycGG/NU7."
        "email" => "sadsad"
        "remember_token" => "A42ezMckkvjCLrpj4jxyHf2iSQWp3iAGfzGoTqMygDimFSzXNx6FW42qCOhP"
        "name" => "sadsa"
        "subscribe" => 0
        "profile_picture" => "VNlQxOlCbXkCGEQ6ZdFS1pbK2tixhsmmhQPhLNLMBRKqDzXegWbqQiJOsplMADKg.jpg"
        "about_you" => ""
        "writing_service" => 0
        "f_card" => 0
        "logo" => ""
        "website" => "das"
        "youtube" => ""
        "status" => "approved"
        "code" => ""
        "active" => 1
        "address" => "asfas"
        "phone" => "dasd"
        "news" => 0
        "terms" => 1
        "radius" => 0
        "created_at" => "2015-07-15 07:31:37"
        "updated_at" => "2015-07-15 07:44:31"
        "stripe_active" => 1
        "stripe_id" => "cus_6c0xE8OxR7fdXJ"
        "stripe_subscription" => "sub_6c0x4RzEoBplCb"
        "stripe_plan" => "small"
        "last_four" => "4242"
        "trial_ends_at" => null
        "subscription_ends_at" => null
        "country" => "Highland"
        "mobile" => "asd"
        "descripsion" => "Ddescription"
        "landline" => "asdas"
        "company_name" => "das"
        "facebook" => "dsad"
        "twitter" => "sadsa"
        "linkedln" => "dsadasd"
        "company_number" => "sad"
        "google" => "sadasd"
        "vat" => "asdsad"
        "experience" => ""
        "privacy" => 0
        "user_id" => 1
        "post_code" => "AB115QN"
        "latitude" => "57.14270109"
        "longitude" => "-2.093014619"
        "identify" => "grEa6JEaj6P0I7Zc3ZCq5CADojzApSJZ.jpg"
        "bill" => "N8WKjRlSttsHNt1crrNdwxG7uqWEg5GB.jpg"
        "comment" => "asdsad"
        "image" => "7dmURWxbzO4pinqbek0yzdIKqEyZrjOD.jpg"
        "title" => "new offer"
      ]
      #original: array:53 [▶]
      #relations: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
    }
    1 => User {#366 ▶}
    2 => User {#367 ▶}
    3 => User {#368 ▶}
    4 => User {#369 ▶}
    5 => User {#370 ▶}
  ]
}

能否解释一下我是如何丢失表之间的所有关系的以及如何避免它?由于结果的结构发生了变化,我不能使用循环、关系等。谢谢!。

【问题讨论】:

  • 6个用户都是同一个用户吗?
  • 是的。我只是试图回显所有 user_id。都是一样的。
  • 那么对于给定的用户,其中一个联接表必须有多个记录。这就是为什么我在上一个问题中询问它的原因,但是没有与用户链接的 Offers 表。
  • 如果单个用户有多个优惠,并且您在用户模型中定义了“优惠”关系,请删除连接并执行 User::with('offers')->whereIn ... . 你应该得到一个用户,你将能够通过 $user->offers 访问优惠
  • 现在更有意义了。我的三分之二表也很少有一个用户的记录 (hasMany),但我可以仅通过 users.thirds 的第一条记录来识别状态。我该如何处理?

标签: php mysql laravel join eloquent


【解决方案1】:

如果我没看错,你只是想

(delete join onto orders)...->groupBy('users.id')->get();

这将返回一个符合条件的用户。

您可以通过 2 个查询来实现此目的,首先对用户进行分组(不要加入订单),然后对订单进行第二次查询。要加入的其他内容取决于您使用哪些表来过滤用户,以及您使用哪些表将数据添加到订单中。 在第二个查询中将数据添加到订单中,在第一个查询中填充您用于过滤用户的内容。您也可以尝试一个子查询,但在 eloquent 中并不能很好地支持它。

你的 whereIn 也完全没有意义,因为你已经在测试用户状态是 2 还是 3。

为了更清楚而编辑,我有点仓促。原本以为发帖人是想往后排一排——其实不然。

【讨论】:

  • 注意状态 3 有更多的条件。无论如何,谢谢。
  • @EvaldasButkus 我不明白你的评论。你试过这个看看结果吗?
  • 是的,我试过了,它选择了正确的记录,但问题是返回的对象不适合用于显示。
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 2015-04-13
  • 2018-11-05
  • 2022-01-26
  • 1970-01-01
  • 2017-10-02
  • 2017-08-24
  • 2015-05-18
相关资源
最近更新 更多