relate.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php namespace System\DB\Eloquent;
  2. class Relate {
  3. /**
  4. * Retrieve the query for a 1:1 relationship.
  5. *
  6. * @param string $model
  7. * @param object $eloquent
  8. * @return mixed
  9. */
  10. public static function has_one($model, $eloquent)
  11. {
  12. $eloquent->relating = __FUNCTION__;
  13. return static::has_one_or_many($model, $eloquent);
  14. }
  15. /**
  16. * Retrieve the query for a 1:* relationship.
  17. *
  18. * @param string $model
  19. * @param object $eloquent
  20. * @return mixed
  21. */
  22. public static function has_many($model, $eloquent)
  23. {
  24. $eloquent->relating = __FUNCTION__;
  25. return static::has_one_or_many($model, $eloquent);
  26. }
  27. /**
  28. * Retrieve the query for a 1:1 or 1:* relationship.
  29. *
  30. * @param string $model
  31. * @param object $eloquent
  32. * @return mixed
  33. */
  34. private static function has_one_or_many($model, $eloquent)
  35. {
  36. $eloquent->relating_key = \System\Str::lower(get_class($eloquent)).'_id';
  37. return Factory::make($model)->where($eloquent->relating_key, '=', $eloquent->id);
  38. }
  39. /**
  40. * Retrieve the query for a 1:1 belonging relationship.
  41. *
  42. * @param array $caller
  43. * @param string $model
  44. * @param object $eloquent
  45. * @return mixed
  46. */
  47. public static function belongs_to($caller, $model, $eloquent)
  48. {
  49. $eloquent->relating = __FUNCTION__;
  50. $eloquent->relating_key = $caller['function'].'_id';
  51. return Factory::make($model)->where('id', '=', $eloquent->attributes[$eloquent->relating_key]);
  52. }
  53. /**
  54. * Retrieve the query for a *:* relationship.
  55. *
  56. * @param string $model
  57. * @param object $eloquent
  58. * @return mixed
  59. */
  60. public static function has_many_and_belongs_to($model, $eloquent)
  61. {
  62. // -----------------------------------------------------
  63. // Get the models involved in the relationship.
  64. // -----------------------------------------------------
  65. $models = array(\System\Str::lower($model), \System\Str::lower(get_class($eloquent)));
  66. sort($models);
  67. $eloquent->relating_table = implode('_', $models);
  68. $eloquent->relating = __FUNCTION__;
  69. $eloquent->relating_key = $eloquent->relating_table.'.'.\System\Str::lower(get_class($eloquent)).'_id';
  70. return Factory::make($model)
  71. ->select(Meta::table($model).'.*')
  72. ->join($eloquent->relating_table, Meta::table($model).'.id', '=', $eloquent->relating_table.'.'.\System\Str::lower($model).'_id')
  73. ->where($eloquent->relating_key, '=', $eloquent->id);
  74. }
  75. }